实现自定义连接池?

Implement custom connection pool?

我想知道是否需要实现自己的连接池,高级算法是什么?

我浏览了 google 上的几个解决方案(链接下方),但对我来说它们都无法扩展。当我说可扩展 我主要关注 getConnection()/borrowConnection() 方法,我需要确保多个线程是否调用此方法 同时,他们没有获得相同的连接,而且等待时间也很短。以下所有解决方案都使用同步 method/block 方法 这根本不可扩展,因为在电子商务线程等应用程序中必须等待。

  1. https://codereview.stackexchange.com/questions/40005/connection-pool-implementation
  2. http://www.javaworld.com/article/2076690/java-concurrency/build-your-own-objectpool-in-java-to-boost-app-speed.html
  3. https://sridharrao85.wordpress.com/2011/07/20/sample-connection-pool-implementation/
  4. http://www.javamadesoeasy.com/2015/12/connection-pooling-in-java-with-example.html

我的解决方案:- 基本上我的方法侧重于如何在粒度级别而不是在数据结构保持方面减少并发 连接池。所以我会保留两个列表(arralylist)

  1. ConnectionsNotInUse
  2. ConnectionInUse

ConnectionsNotInUse 将在启动时将所有连接(包装在自定义连接 class 中)保存在池中。现在,如果一个线程请求连接,一旦它成功获取,它将把它从 ConnectionsNotInUse 中移除并放入 ConnectionsInUse 中。

在每个自定义连接 class 中,将有方法 getConnection() 方法,该方法将使用 Semaphore.tryAcquire() 获取锁,如果锁可用并且立即 returns,与价值真实。它将是一个许可证的信号量。所以如果线程没有得到连接,它将循环到列表中的另一个连接。

如果最后如果线程没有获得任何连接,如果最大允许限制允许,它将创建另一个连接,否则它将等待连接被释放。 一旦连接被释放,它通知等待连接的线程

有任何 comments/suggestions 方法建议吗?

据我了解你的描述:

连接池最初的实现就像一个只有一个入口的房间,只允许一个人(线程)进入。你担心的是人会在入口排队,影响扩展性。你的应用程序。所以你决定有多个入口(自由列表)。但是您似乎没有指定他们应该尝试哪个入口,我假设您让他们先尝试。如果第一个入口不可用,他们将尝试下一个入口。

所以如果我的理解是正确的,他们选择入口的策略是性能的核心。如果他们都先尝试,然后再尝试,那么与原来的实现差别不大。

我能想到的快速且不同步的方法是散列人的身份。如果结果入口不再免费,则有两种方法:

  • 查找下一个
    • 再次哈希
    • 下一个位置等
  • 新建

所以从比喻上移开。 我描述的就像是hashmap的实现,你可以通过两种方式来尝试:

  • 用 hashmap 替换你的列表
  • 使用混合使用和空闲连接的单个映射,在这种情况下,您可以避免巨型锁,但您需要使用 ConcurrentHashMap 或实现您的版本。

一些注意事项:

  • 如果你使用两个由不同线程共享的列表来维护,你仍然需要对它们进行巨型锁定,否则会崩溃。
  • 您将增加连接数以与最大允许连接数进行比较,这也需要同步。

一些建议:

  • 使用原子整数作为计数器
  • 使用ConcurrentHashMap或实现你的版本(实际上它就像一个数组添加链表并且数组元素是避免巨型锁的列表锁)