【发布时间】: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