数据库连接池数据结构

时间:2009-05-27 10:04:27

标签: java database algorithm data-structures

我想开发数据库连接池。

有人可以告诉我需要使用哪种数据结构来维护池吗?

7 个答案:

答案 0 :(得分:9)

应使用对象池设计模式来实现。你可以阅读它 Kircher, Michael; Prashant Jain; (2002-07-04). "Pooling Pattern". EuroPLoP 2002. Retrieved on 2007-06-09.Object Pool Design Pattern。可以找到ObjectPoolJDBCConnectionPool类的Java实现here

对象池通常是一个 singleton ,其中包含两个对象集合(例如数据库连接):

  1. 解锁 - 针对免费对象,可以通过请求提供给客户
  2. 已锁定 - 适用于现在正在使用的锁定对象
  3. 此收藏集可以ListsHashTables或其他方式实施,具体取决于您的需求。对于简单的ObjectPool - LinkedList 结构就足够了。

答案 1 :(得分:4)

不是开发自己的,而是使用广泛使用且经过充分测试的Commons DBCP库。

答案 2 :(得分:3)

答案 3 :(得分:3)

您通常需要:

  • 围绕“原始”Connection对象的某种包装来管理诸如上次发出连接时的内容,诊断信息,可能是为该连接准备好的语句的缓存等等 - 你定义它包含你需要的内容
  • 用于放置连接包装器的集合,支持并发添加/删除 - 任何正确同步的列表都可以,但ConcurrentLinkedQueue将是一个合理的选择
  • 一种管理池中分配的方法 - 考虑使用Semaphore
  • 可能,将各个池分组到一些“池管理类”(例如,所以你可以调用“getConnection(databaseName,readOnly)”并将其转到相关池中)

除此之外,您还可以构建所需的任何日志记录/监控。

还有倡导现成的连接池框架。我知道有些人不同意,但我个人不会走这条路 - 连接池(a)真的不难写,(b)构成你可能需要理解的系统的关键部分并自定义。

答案 4 :(得分:0)

您正在寻找一个开源解决方案吗?

请参阅Apache Database Connection Pool API

答案 5 :(得分:0)

请参阅此Sun开发人员教程:Connection Pooling

  

在每个JDBC 2.0之前的版本中   数据库会话需要一个新的   即使连接和登录   以前的连接和登录使用了   相同的表和用户帐户。如果你   正在使用2.0之前的JDBC版本   并且想要提高性能,你   可以缓存JDBC连接。

答案 6 :(得分:-1)

不确定创建自己的智能是否明智。

我在许多项目中使用了c3p0连接池(使用Hibernate)并取得了巨大成功