我的情况如下:
我必须维护一台服务器,使用 Tomcat(6) 作为网络服务器,上面有一堆网络应用程序。这些网络应用程序由其他人维护。我们的服务器连接到另一个部门的数据库服务器,其中包含我们的网络应用程序需要显示的信息。如果没有适当的池策略,我们的服务器很快就会变成灾难。
既然我向大家介绍了 Pooling(我选择了 BoneCP - 0.7),我们将创建一个位于 Tomcat 的全局 JNDI 上下文中的池,让每个人都可以从中获得连接。我想这应该可以解决问题。
我担心的是:我怎样才能完全控制这个 Pooling ?我有一些要求:
我想在运行时手动或以编程方式重新加载数据源配置(将在需要时尝试连接到备份服务器)
更改连接数(最小、最大、空闲连接),可以不时更改
最好让 Tomcat 保持事件状态
我打算构建一个使用 JMX 连接和检索信息的警报系统,并有一个按钮来重新加载池(我知道所有池化策略都有某种恢复,但其他数据库服务器会定期崩溃,因此手动重新启动连接在某种程度上更可取)。
我想到了一些可能的解决方案:
- 告诉 Tomcat 重新启动它的全局 JNDI 上下文
- 告诉 Tomcat 重新启动它的 DataSource 对象
- 告诉 BoneCP 重新启动它的池,并在必要时重新创建连接
- 重启 Tomcat 本身
我的问题是:
- 我能否在不影响 Tomcat(和其他网络应用程序)的情况下安全地执行上述解决方案?
- 我应该费心这样做吗? (我猜只是重新启动 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/