可扩展的Java Web应用程序中的连接池

时间:2017-10-26 08:21:56

标签: java jdbc connection-pooling scalability

我只是好奇如何解决可伸缩java应用程序中的连接池问题。

想象一下,我有安装了HikariCP的java Web应用程序(最大池大小为20)和最大允许连接数为100的PosgtreSQL。

现在我想为我的网络应用程序(无论如何)实现可扩展性方法,即使使用自动缩放也是如此。因此,我不知道最终会有多少Web应用程序副本,它可能会动态更改(由某些原因导致,例如群集工作负载)。

但是有问题。当我创建超过5个Web应用程序副本时,导致我的总连接数超过最大允许连接数。

是否有任何最佳实践可以解决此问题(除了明显增加最大允许连接数/减少池大小)?

由于

2 个答案:

答案 0 :(得分:0)

您需要一个基于Web应用程序的协调器。它将负责扩展输入,它将管理连接,以便不超过100的限制。它将根据流量打开 - 关闭连接。

尽管如此,我的建议是考虑迁移到无SQL数据库,这是更适合可扩展性和性能的解决方案。

答案 1 :(得分:0)

我首先要说的是,无论你做什么,只要你受到100个数据库连接的限制 - 它就无法扩展!

也就是说,你可以通过应用一些已知的技巧来优化和“挤压”性能。了解权衡(可用性与一致性,延迟与吞吐量等)非常重要:

  1. 缓存:如果您可以预测某些select个查询,您可以离线计算它们(甚至可以从副本中计算?)并缓存结果。权衡:用户可能得到的结果不是最新的

  2. 缓冲/限制:所有更新/插入都会进入队列,只有少数工作人员可以从队列中提取并更新数据库。权衡:您获得更多可用性,但变得“最终一致”(因为更新不会立即显示)。

  3. 您可能需要以异步方式运行select,这意味着用户提交了一个查询,当它准备就绪时,它将被“推送”回到客户端(或者客户端可以每隔几秒钟保持“轮询”)。它也可以通过回调来实现。

  4. 通过将更新(写入)与读取分开,您可以通过创建“只读”副本以及Web服务器可用于读取查询的副本来获得更高的性能。