emi*_*lly 5 java connection concurrency connection-pooling
我想知道我是否需要实现自己的连接池,什么是高级算法?
我在google上浏览了几个解决方案(链接下方),但所有这些解决方案看起来都不适合我.当我说可扩展时,我主要关注的getConnection()/borrowConnection()方法,我需要确保如果多个线程同时调用此方法,它们不会获得相同的连接,并且等待是最小的.以下所有解决方案都使用同步方法/块方法,这种方法根本不可扩展,因为像电子商务线程这样的应用程序必须等待.
我的解决方案: -基本上我的方法专注于如何在粒度级别减少并发性,而不是在持有连接池的数据结构上.所以我会保留两个清单(arralylist)
ConnectionsNotInUse将在启动时保存池中的所有连接(包装在自定义连接类中).现在,如果一个线程要求连接,一旦它成功获取,它将从ConnectionsNotInUse中删除它并将其放入ConnectionsInUse.
在每个自定义连接类中,将有一个方法getConnection()方法,它将使用Semaphore.tryAcquire() 它获取一个锁,如果有一个锁并立即返回,值为true.它将是一个许可证的信号量.因此,如果线程没有获得连接,它将循环遍历列表中的另一个连接.
如果最后如果线程没有得到任何连接,如果最大允许限制允许,它将创建另一个连接,否则它将等待连接被释放.一旦释放连接,它就会通知等待连接的线程
有关方法的任何意见/建议吗?
据我了解你的描述:
连接池最初的实现就像一间只有一个入口的房间,只允许一个人(线程)进入。你担心的是人会在入口处排队,影响你的应用程序的可扩展性。所以你决定有多个入口(空闲列表)。但你似乎没有指定他们应该尝试哪个入口,我假设你让他们先尝试。如果第一个入口不可用,他们将尝试下一个入口。
所以如果我的理解是对的,他们选择哪个入口的政策是绩效的核心。如果他们都先尝试,然后再尝试,那么与最初的实现没有什么区别。
我能想到的快速且无同步的方法是对人的身份进行哈希处理。如果结果入口不再免费,有两种方法:
所以从隐喻上退一步。我所描述的就像是 hashmap 的实现,你可以通过两种方式尝试:
一些注意事项:
一些建议:
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |