【问题标题】:JDBC Connection Pooling in a Tomcat Cluster EnvironmentTomcat 集群环境中的 JDBC 连接池
【发布时间】:2016-12-20 06:59:44
【问题描述】:

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

我有几个关于此设置的问题:

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

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

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

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

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

【问题讨论】:

    标签: apache tomcat connection-pooling mod-proxy


    【解决方案1】:

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

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

    确实,您最终可能会遇到这样一种情况,即一次有太多用户连接到数据库,这会使您的数据库不堪重负,但这也可能发生在单个节点上。多节点在概念上没有什么不同,而单节点也不适用。

    关键是确保您的集群适当地平衡用户,这样您就没有限制,例如每个节点 5 个数据库连接,但 100 个用户最终在一个节点上,而其他节点每个节点只有 5 个用户。在这种情况下,流行节点(100 个用户)将不得不共享这 5 个连接,而在其他节点上,每个用户都获得一个自己的连接。

    回到你的第一个项目,这更复杂。如果每个用户都有一个单独的数据库,那么连接池是不可能完成的事情,因为你绝对必须每次都为每个用户建立一个新连接。这些连接不是可池化的,至少在没有非常小心的情况下是这样。听起来您可能需要先解决架构问题,然后才能确定该问题的技术解决方案。

    【讨论】:

    • 有同样的疑问,所以假设现在用户被分类的架构更改并且每个类别都有一个 100 个连接池(有 N 个类别),我是否仍然不担心关于连接池,因为它可能不会在很大程度上影响我的性能?
    • 所以在你的代码中你会有类似DataSource ds = ctx.lookup("java"comp/env/jdbc/categoryN")?我认为您会遇到同样的问题,因为那时您需要具有 100 个连接的 N 个池……每个节点?我认为无论如何,您都需要对每个节点上的少量连接感到满意。您会惊讶于每个节点有 5-10 个连接可以完成多少工作。如果您的数据库可以处理更多,请增加池中的连接数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2012-03-02
    • 2012-07-12
    • 2013-05-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多