2013-08-28 52 views
1

我碰到这个面试问题就来了:你将如何管理一个数据库连接池? 我的想法是: 我将创建一个ArrayBlockingQueue<Connection>,来创建连接对象,并把它们放在队列时ajvm启动。然后用某种形式的enum单例包装它,这样只有一个这样的队列,并且它在JVM的生命周期中保持活动状态。如何管理一个自定义的数据库连接池

然后使用某种工具/驱动程序类,将采取从队列连接,并退回他们回到队列。

我想我需要说这个还有什么?我是否需要使队列线程安全,以便多个请求不具有相同的连接?

+0

你应该有一个线程来监视数据库连接(它们是否关闭并打开新的连接) – anfy2002us

+0

你是指uility/driver class是什么意思? – LoveMeow

回答

0

在我opninion你在这里失踪几点:

  1. 连接应该返回回池中时,返回到初始状态。例如,connection.setAutocommit(...);应该一定还原

  2. 我不是一个好主意,将原生连接包装到您自己的javax.sql.Connection接口实现中,以控制和监视在连接上执行的操作。使用这种模式,你也可以实现一个有价值的功能:在close()返回连接池。调用

  3. 你需要一些menans控制在根据实际池的利用率池的连接数。看看如何“能力”和“负载因子”在Java集合实现得到一个粗略的实现思路,如果他们还活着

  4. 连接进行监控。对所有可能的数据库进行归档并不容易。

+0

Thnaks ...如何确保两个线程之间不共享相同的连接? – Victor

+0

也许在包装类,我有一个getInstance(连接con)方法,我让这个方法同步?但是,这是我认为不好的表现 – Victor

+1

使这些方法同步并不会节省您的时间。如果要控制访问连接的线程,请考虑每次调用封装类时检查线程ID。如果id与以前记录的拥有者线程ID不同,则可以抛出异常。你可以得到id或当前线程为Thread.currentThread()。getId(); – Jk1