Java 实现自定义连接池?
我想知道我是否需要实现自己的连接池,高级算法是什么 我浏览了谷歌上的几个解决方案(链接下方),但它们对我来说都不可扩展。当我说可伸缩 我主要关注Java 实现自定义连接池?,java,concurrency,connection,connection-pooling,Java,Concurrency,Connection,Connection Pooling,我想知道我是否需要实现自己的连接池,高级算法是什么 我浏览了谷歌上的几个解决方案(链接下方),但它们对我来说都不可扩展。当我说可伸缩 我主要关注getConnection()/borrowConnection()方法,其中我需要确保是否有多个线程同时调用此方法 同时,他们并没有得到相同的连接,而且等待时间也很短。以下所有解决方案都使用同步方法/块方法 这是不可扩展的,因为在应用程序中,如电子商务线程必须等待 我的解决方案:-我的方法主要关注如何在粒度级别而不是在数据结构保持级别降低并发性
getConnection()/borrowConnection()
方法,其中我需要确保是否有多个线程同时调用此方法
同时,他们并没有得到相同的连接,而且等待时间也很短。以下所有解决方案都使用同步方法/块方法
这是不可扩展的,因为在应用程序中,如电子商务线程必须等待
我的解决方案:-我的方法主要关注如何在粒度级别而不是在数据结构保持级别降低并发性
连接池。因此,我将保留两个列表(arralylist)
信号量.tryAcquire()
,该方法获取一个锁(如果可用),并立即返回值为true的锁。它将是带有一个许可证的信号灯。所以,若线程并没有得到连接,它将循环到列表中的另一个连接
若最后,若线程并没有得到任何连接,若最大允许限制允许,它将创建另一个连接,否则它将等待连接被释放。
一旦连接被释放,它就会通知等待连接的线程
对建议的方法有任何意见/建议吗?据我所知,您的描述: 连接池的最初实现就像一个只有一个入口的房间,只允许一个人(线程)进入。你担心的是,这个人会在入口处排队,影响你应用程序的可伸缩性。所以你决定有多个入口(免费列表)。但是你似乎没有指定他们应该尝试哪个入口,我想你应该让他们先尝试。如果第一个不可用,他们将尝试下一个入口 因此,如果我的理解是正确的,他们选择的政策是绩效的核心。如果他们都先尝试,然后再尝试,这与最初的实现几乎没有区别 我能想到的快速和不同步的方法是散列人的身份。如果由此产生的入口不再免费,将有两种方式:
- 找到下一个
- 再次散列
- 下一个职位等
- 创造新的
所以,从隐喻中退一步。 我所描述的类似于hashmap的实现,您可以通过两种方式进行尝试:
- 用hashmap替换您的列表
- 使用一个单独的映射混合使用和自由连接,在这种情况下,您可以避免巨大的锁,但您需要使用ConcurrentHashMap或实现您的版本
- 如果您使用由不同线程共享的两个列表来维护,您仍然需要对它们进行巨锁,否则将使其崩溃
- 您将增加连接数,以便与最大允许连接数(也需要同步)进行比较
- 使用原子整数作为计数器
- 使用ConcurrentHashMap或实现您的版本(实际上它就像一个数组addLinkedList,数组元素是列表的锁,避免了巨大的锁)
HashMap
中的键和值是什么?键可以是线程的数目,值是连接的列表。当线程尝试获取连接时,它可以修改hashcode以获取密钥,然后从列表中获取连接。