jakarta-ee - 有没有办法在运行时重新加载 Tomcat 的连接池?

标签 jakarta-ee tomcat connection-pooling bonecp

我的情况如下:

  • 我必须维护一台服务器,使用 Tomcat(6) 作为网络服务器,上面有一堆网络应用程序。这些网络应用程序由其他人维护。我们的服务器连接到另一个部门的数据库服务器,其中包含我们的网络应用程序需要显示的信息。如果没有适当的池策略,我们的服务器很快就会变成灾难。

  • 既然我向大家介绍了 Pooling(我选择了 BoneCP - 0.7),我们将创建一个位于 Tomcat 的全局 JNDI 上下文中的池,让每个人都可以从中获得连接。我想这应该可以解决问题。

我担心的是:我怎样才能完全控制这个 Pooling ?我有一些要求:

  • 我想在运行时手动或以编程方式重新加载数据源配置(将在需要时尝试连接到备份服务器)

  • 更改连接数(最小、最大、空闲连接),可以不时更改

  • 最好让 Tomcat 保持事件状态

  • 我打算构建一个使用 JMX 连接和检索信息的警报系统,并有一个按钮来重新加载池(我知道所有池化策略都有某种恢复,但其他数据库服务器会定期崩溃,因此手动重新启动连接在某种程度上更可取)。

我想到了一些可能的解决方案:

  • 告诉 Tomcat 重新启动它的全局 JNDI 上下文
  • 告诉 Tomcat 重新启动它的 DataSource 对象
  • 告诉 BoneCP 重新启动它的池,并在必要时重新创建连接
  • 重启 Tomcat 本身

我的问题是:

  1. 我能否在不影响 Tomcat(和其他网络应用程序)的情况下安全地执行上述解决方案?
  2. 我应该费心这样做吗? (我猜只是重新启动 Tomcat)

最佳答案

(为什么有人选择 BoneCP?我听说过的每一个涉及 BoneCP 的问题都通过张贴者切换到另一个 CP 来解决并且一切正常。BoneCP 甚至还没有到 v1.0。我猜这是下一件大事。只是还没有到来。)

Tomcat 支持 Apache commons-dbcp 和 Tomcat 自己的内置 tomcat-pool:只需按照 Tomcat 文档配置 JNDI 连接池即可。

不幸的是,Tomcat 目前不支持在运行时重新加载数据源。您可以通过 JMX 更改属性,但更改无效。您也可以关闭池,但最终得到的是一个封闭的池,它毫无值(value)。

Tomcat's bugzilla 中记录增强功能可能是一件好事。

关于jakarta-ee - 有没有办法在运行时重新加载 Tomcat 的连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029613/

相关文章:

java - 如何在同一页面上显示 Controller 的异常?

eclipse - 网页上的新行 - Java servlet

css - Java EE Web 应用程序中的路径相关问题

Tomcat 8 找不到 com.sun.faces.config.ConfigureListener 类

java - C3PO 连接池 - 连接未释放

java - UserTransaction.SetTransactionTimeout 不起作用?

tomcat - 使用 EclipseLink 配置连接池

java - 无法在 tomcat 上访问 webservice 出现 500 错误

java - JDBC连接池管理

java - 为地址为 null 且端口为 8080 的连接器创建的最大线程数 (200)