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

时间:2012-12-25 10:00:34

标签: java-ee tomcat connection-pooling bonecp

我的情况如下:

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

  • 现在我向所有人介绍了Pooling(我选择了BoneCP - 0.7),我们将创建一个保留在Tomcat全局JNDI Context上的单个池,让每个人都可以从中获得连接。我想这应该可以解决问题。

我担心的是:我如何完全控制这个Pooling?我有一些要求:

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

  • 更改可能会不时更改的连接数(最小值,最大值,空闲连接数)

  • 优先保持Tomcat活着

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

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

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

我的问题是:

  1. 我是否可以安全地执行上述解决方案而不影响Tomcat(和其他Web应用程序)?
  2. 我应该打扰这个吗? (我想,只需重启Tomcat)

1 个答案:

答案 0 :(得分:2)

(为什么有人会选择BoneCP?我曾经听过的每一个涉及BoneCP的问题都可以通过海报切换到另一个CP来解决,一切正常.BoneCP甚至不是在v1.0。我想这是下一件大事。还没有到达。)

Tomcat支持Apache commons-dbcp和Tomcat自带的tomcat-pool内置:只需根据Tomcat文档配置您的JNDI连接池即可。

不幸的是,Tomcat目前不支持在运行时重新加载DataSource。您可以通过JMX更改属性,但更改不起作用。你也可以关闭游泳池,但最后你会得到一个没有价值的封闭游泳池。

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