apache - Tomcat 集群环境中的 JDBC 连接池

标签 apache tomcat connection-pooling mod-proxy

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

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

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

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

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

  2. 由于性能问题,我不想在每个 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/

相关文章:

mysql - 相当于pgpool-II for MySQL

.net - 从池中获取连接之前超时时间已过 - 但池未满

apache - RewriteRules 不加载某些 css。 js 和图像

apache - 如何重定向几乎相似的链接?

JAVA HTTP 客户端和 Serlvlet

java - Tomcat 和 Matlab 编译器运行时内存不足错误

java - 我必须在哪里放置 Tomcat 连接池的 JDBC 驱动程序?

java - 使用apache poi检测excel中的隐藏单元格

php - 如何在apache的自定义错误响应包中包含错误文档的页眉和页脚?

非 HTTP 负载的 Java 容器选项