如何管理自定义数据库连接池

Posted

技术标签:

【中文标题】如何管理自定义数据库连接池【英文标题】:How to manage a custom db connection pool 【发布时间】:2013-08-28 18:07:31 【问题描述】:

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

然后使用某种实用程序/驱动程序类从队列中获取连接并将它们返回到队列。

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

【问题讨论】:

你应该有一个线程来监视数据库连接(它们是否关闭并打开新连接) 实用程序/驱动程序类是什么意思? 【参考方案1】:

在我看来,您在这里遗漏了几点:

    连接返回池时应返回初始状态。例如,connection.setAutocommit(...);绝对应该恢复

    将本机连接包装到您自己的 javax.sql.Connection 接口实现中以控制和监视对连接执行的操作不是一个好主意。使用这种模式,您还可以实现一个有价值的功能:在 close() 时将连接返回到池;打电话

    您需要一些方法来根据实际池利用率控制池中的连接数。看看Java集合中“容量”和“负载因子”是如何实现的,粗略的实现思路

    如果连接处于活动状态,则应对其进行监控。为所有可能的数据库归档并不容易。

【讨论】:

Thnaks...如何确保两个线程之间不共享相同的连接? 也许在包装类中,我有一个 getInstance(Connection con) 方法,我让这个方法同步?但我认为这是糟糕的表现 使这些 mwthods 同步不会把你保存在这里。如果要控制访问连接的线程,请考虑在每次调用包装类时检查线程 ID。如果 id 与之前记录的所有者线程 id 不同,那么您可以抛出异常。您可以获取 id 或当前线程为 Thread.currentThread().getId();

以上是关于如何管理自定义数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

MySQL自定义数据库连接池和开源数据库连接池的使用

Java-自定义简单的mysql数据库连接池

自定义连接池(装饰者模式)

连接池 DBCP c3p0以及分页的案例

JDBC-05-笔记

数据库连接池原理详解与自定义连接池实现