Java 实现自定义连接池?

Java 实现自定义连接池?,java,concurrency,connection,connection-pooling,Java,Concurrency,Connection,Connection Pooling,我想知道我是否需要实现自己的连接池,高级算法是什么 我浏览了谷歌上的几个解决方案(链接下方),但它们对我来说都不可扩展。当我说可伸缩 我主要关注getConnection()/borrowConnection()方法,其中我需要确保是否有多个线程同时调用此方法 同时,他们并没有得到相同的连接,而且等待时间也很短。以下所有解决方案都使用同步方法/块方法 这是不可扩展的,因为在应用程序中,如电子商务线程必须等待 我的解决方案:-我的方法主要关注如何在粒度级别而不是在数据结构保持级别降低并发性

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

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

  • 我的解决方案:-我的方法主要关注如何在粒度级别而不是在数据结构保持级别降低并发性 连接池。因此,我将保留两个列表(arralylist)

  • 连接不使用
  • 结缔组织
  • ConnectionsNotInUse将在启动时保存池中的所有连接(包装在自定义连接类中)。现在,如果一个线程请求连接,一旦它成功获得连接,它将从ConnectionsNotInUse中删除它,并将其置于ConnectionsInUse中

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

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


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

    据我所知,您的描述:

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

    因此,如果我的理解是正确的,他们选择的政策是绩效的核心。如果他们都先尝试,然后再尝试,这与最初的实现几乎没有区别

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

    • 找到下一个
      • 再次散列
      • 下一个职位等
    • 创造新的

    所以,从隐喻中退一步。 我所描述的类似于hashmap的实现,您可以通过两种方式进行尝试:

    • 用hashmap替换您的列表
    • 使用一个单独的映射混合使用和自由连接,在这种情况下,您可以避免巨大的锁,但您需要使用ConcurrentHashMap或实现您的版本
    一些注意事项:

    • 如果您使用由不同线程共享的两个列表来维护,您仍然需要对它们进行巨锁,否则将使其崩溃
    • 您将增加连接数,以便与最大允许连接数(也需要同步)进行比较
    一些建议:

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

    您在这里建议,连接的获取速度太快,以至于同步成本太高——那么您有哪种网络(将使用该连接)比同一CPU上的线程同步更快?换句话说,你确定这会是一个瓶颈吗?@john16384它肯定会是一个瓶颈。考虑电子商务网站,其中百万的请求试图同时获取连接。通过方法/块同步,每个请求都必须以顺序方式运行。您的站点可能需要一次处理一百万个请求,但没有Java VM可以一次处理一百万个线程。大多数可扩展的设置将处理最多1000个线程(通常更低),并将其余线程排队。然后通过在多个实例上进行负载平衡来实现进一步的扩展。@john16384同意。甚至考虑500请求同时获取连接。对于方法/块同步,每个请求必须以顺序方式运行。同意大多数观点。但是在您建议的解决方案中,
    HashMap
    中的
    键和值是什么?键可以是
    线程的数目,值是连接的列表。当线程尝试获取连接时,它可以修改hashcode以获取密钥,然后从列表中获取连接。