我对此比较陌生,但我设置了一个 Tomcat 集群(使用来自 httpd 的 mod_proxy
)和 session 复制(单独的 redis 服务器)以实现容错。
我有几个关于此设置的问题:
我的应用程序 (spring/hibernate) 每个用户都有不同的数据库。所以这里的问题是数据源(使用 spring 和 hibernate 来持久化)是在 Tomcat 级别创建的。因此,无论我做什么连接池,都将在服务器级别进行。
根据集群配置,Tomcat 实例将创建自己的连接池。
我想知道是否可以使用 Tomcat 在集群级别使用连接池,即有没有办法确保集群中的所有服务器都在使用共享连接池?
由于性能问题,我不想在每个 Tomcat 实例上配置
DataSource
。在集群设置之前,应用程序部署在单个服务器上,并且DataSource
配置为每个DataSource
只允许连接池中的几个 (50) 个连接。现在在集群环境中,我无法在每个 Tomcat 上创建或拆分这些连接数,而且节点的动态注册会产生更多问题。我还想知道如果连接池不可能或效率低下,是否有其他解决方案可以解决此问题?
最佳答案
我将以相反的顺序处理您的问题,因为第二个问题更简单。
Tomcat 中的数据库连接池不能在集群范围内配置:您必须为集群中的每个节点配置一个单独的池。但这不一定是坏消息……将节点配置为在每个节点的连接池中有 5 个或 10 个或 100 个连接并没有错。
确实,您最终可能会遇到这样一种情况,即一次有太多用户连接到数据库,这会导致数据库不堪重负,但这也可能发生在单个节点上。对于单节点而言,多节点在概念上没有任何不同。
关键是要确保你的集群适本地平衡用户,这样你就没有限制,例如每个节点 5 个数据库连接,但 100 个用户最终在一个节点上,而其他节点每个节点只有 5 个用户。在这种情况下,流行节点(100 个用户)将不得不共享这 5 个连接,而在其他节点上,每个用户都会获得一个全部属于自己的连接。
回到你的第一个项目,它更复杂。如果每个用户都有一个单独的数据库,那么连接池就不可能完成,因为您每次都必须为每个用户建立一个新连接。那些连接不是可合并的,至少在不十分小心的情况下是不可合并的。听起来您有一个架构问题,您可能必须先解决这个问题,然后才能确定该问题的技术解决方案。
关于apache - Tomcat 集群环境中的 JDBC 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41236543/