java - 实现自定义连接池?

标签 java concurrency connection connection-pooling

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

我在谷歌上浏览了几个解决方案(链接下方),但对我来说所有这些解决方案看起来都不可扩展。当我说可扩展 我主要关注 getConnection()/borrowConnection() 方法,我需要确保是否有多个线程调用此方法 同时,他们没有获得相同的连接,而且等待时间也很短。以下所有解决方案都使用同步方法/ 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. 未使用的连接数
  2. 正在使用中的连接

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

在每个自定义连接类中,将有方法 getConnection() 方法,该方法将使用 Semaphore.tryAcquire() 获取锁,如果锁可用并立即返回,值为 true。它将是一个许可证的信号量。因此,如果线程没有获得连接,它将循环寻找列表中的另一个连接。

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

对建议的方法有任何意见/建议吗?

最佳答案

据我了解你的描述:

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

所以如果我的理解是正确的,他们选择入口的策略是性能的核心。如果他们都先尝试,然后再尝试,那么这与最初的实现几乎没有区别。

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

  • 找到下一个
    • 再次散列
    • 下一个位置等
  • 新建

所以从隐喻上退一步。 我所描述的就像是 hashmap 的实现,您可以通过两种方式进行尝试:

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

一些注意事项:

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

一些建议:

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

关于java - 实现自定义连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41874688/

相关文章:

java - 如何设置 JavaFX WebView 的编码?

java - localTimeDate公式转换

java - Siddhi 是否无法按多个变量进行分组?

java - Font Awesome 问题

java - 有多少个线程可以同时调用一个对象的非同步方法?

java - 共享资源先到先得政策

.net - ConcurrentDictionary 的列表顺序是否得到保证?

c# - TCP 连接阶段失败(从 JAVA 客户端调用 Web 服务到 C# 服务器)

php - MySQL 连接、无限 PHP 循环和临时中断

java - 我应该如何为我的系统建模 - 数据库含义