Tomcat集群环境中的JDBC连接池

时间:2016-12-20 06:59:45

标签: apache tomcat connection-pooling mod-proxy

我对此比较陌生,但我设置了一个Tomcat集群(使用httpd中的mod_proxy)和会话复制(单独的redis服务器)以实现容错。

我对此设置有几个问题:

  1. 我的应用程序(spring / hibernate)每个用户有一个不同的数据库。所以这里的问题是在Tomcat级别创建数据源(使用spring和hibernate进行持久化)。因此,无论我做什么连接池都将在服务器级别。

    根据群集配置,Tomcat实例将创建自己的连接池。

    我想知道是否可以使用Tomcat在集群级别进行连接池,即是否有办法确保集群中的所有服务器都使用共享连接池?

  2. 由于性能问题,我不想在每个Tomcat实例上配置DataSource。在群集设置之前,应用程序部署在单个服务器上,DataSource已配置为每DataSource个连接池中只允许少数(50)个连接。

    现在在集群环境中,我无法在每个Tomcat上创建或拆分这些连接数,并且节点的动态注册也会产生进一步的问题。我还想知道如果连接池不可能或效率低下,是否有一些替代解决方案?

1 个答案:

答案 0 :(得分:2)

我将以相反的顺序处理你的问题,因为第二个更简单。

无法在群集范围内配置Tomcat中的数据库连接池:您必须为群集中的每个节点配置单独的池。但这不一定是坏消息......将节点配置为在每个节点的连接池中有5个或10个或100个连接没有任何问题。

确实如此,您最终会遇到这样的情况:您有太多用户一次连接到数据库,这会淹没您的数据库,但也可能在单个节点上发生这种情况。对于单个节点而言,多节点没有任何概念上的不同之处。

关键是要确保您的群集能够正确平衡用户,这样您就不会受到限制。每个节点有5个数据库连接,但100个用户最终在一个节点上,而其他节点每个节点只有5个用户。在这种情况下,流行节点(100个用户)必须共享这5个连接,而在其他节点上,每个用户都可以自己连接。

回到你的第一个项目,这更复杂。如果每个用户有一个单独的数据库,那么连接池是不可能实现的,因为您每次都必须为每个用户建立一个新连接。这些连接不是可以使用,至少不是没有非常小心。在您确定该问题的技术解决方案之前,您可能需要解决一个架构问题。