【问题标题】:How to improve on this connection pool design?如何改进这种连接池设计?
【发布时间】:2011-11-10 16:01:15
【问题描述】:

首先,我正在开发自己的 DBCP(数据库连接池)实现,因此,

我不会接受任何使用 3rd 方 DBCP(如 c3p0)的建议。

我使用生产者-消费者设计模型作为我的 DBCP 的主要设计模板。

             PRODUCER | CONSUMER
Pn, ... P3, P2, P1 >>   << C1, C2, C3, ... Cn

对于生产者和消费者,我使用 LinkedList 队列。

生产者队列

它将由最大数量的 SQLConnectionWrapper 实例填充。我已采取措施确保连接在队列中是唯一的。在 .close() 之后,连接将,

  • 首先,删除 C 队列中的第一个元素(如果有)
  • 否则,进入 P 队列。

我使用管家线程来删除队列中过时/过期的连接,并生成新连接以保持配置的最小连接数。

消费者队列

它将由 FutureTask 实例填充。使用我的 DBCP 的应用会调用

Connection conn = dbcp.getConnection(long timeout);

会的,

  • 首先创建一个 Consumer FutureTask,
  • 删除 P 队列中的第一个元素(如果有)
  • 否则,进入 C 队列,
  • 阻塞 .get(timeout) 直到它被生产者“喂”或超时,以先到者为准。

我的问题

这个设计可以进一步改进吗?有什么明显的弱点吗?

我的首要任务是在并发使用环境中保持稳定性。我从当前的测试中了解到,由于涉及 2 个队列,因此需要双方同步。

现在,我正在探索以下想法:

  • 将 2 个队列减少为 1 个双端队列(尽管我无法思考如何让 P 端消灭 C 端)
  • 创建一个同步的 annihilator 线程,无需生产者和消费者相互检查。

【问题讨论】:

  • 您使用linkedlist作为队列而不是j.u.c中众多队列实现之一的任何原因?
  • 项目已经 1 周了。我使用 LinkedList 因为项目处于概念验证阶段。此外,通过测试检测到的同步问题本质上是外部的。对 j.u.c. 的改变稍后会来。

标签: java database queue connection-pooling producer-consumer


【解决方案1】:

既然你已经说过你不会接受任何第三方池的建议。我猜你的意思是任何第三方连接池。

你可以看到类似apache commons connection pool 的东西,它为任何对象提供池化设施。因此,虽然我无意冒犯,也不想让您气馁,但我认为您正在尝试重新发明轮子。

话虽如此,上面的链接给出了一个非常高级的通用池设计。检查如何使用游泳池,您将对正在发生的事情有一个公平的想法,并且也会帮助您进行设计。

【讨论】:

  • 未拍摄。这个设计理念是我原创的,上周开始的。以前,我已经在 Openfire 开源代码中查看并测试了 DBCP 实现。 IMO,我发现它的设计没有公平地将连接分配给等待的消费者线程。因此,我使用队列,因此可以在公平的“先到先得”的基础上管理生产者和消费者。
  • 我希望更新 annihilator 线程正在工作并保持 P-C 之间的同步完好无损。总的来说,项目已经完成,我必须专注于其他项目。我仍然欢迎对这个问题提出任何建议。如果未来 2 周内没有更新,我会考虑将此问题视为未回答。
猜你喜欢
  • 2013-01-22
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多