我正在使用hibernate和c3p0进行连接池。
我们面临的问题是我们会定期执行数据库升级,这些升级不会对活动连接生效 - 因此正在运行的应用程序需要清除打开的连接并重新连接。
我知道c3p0中有连接的maxAge,但我不认为将它设置为小于30秒的值是明智的。
是否有任何机制可以告诉应用程序立即断开/重新连接?
我不确定如何利用测试查询?
欢迎提示。
第
答案 0 :(得分:1)
c3p0 PooledDataSources提供hardReset()
方法和一系列softReset方法,这些方法将使用新的Connections替换池中的所有Connections。参见
http://www.mchange.com/projects/c3p0/apidocs/com/mchange/v2/c3p0/PooledDataSource.html
hardReset()
肯定且确定且具有破坏性:它将close()
来自DataSource管理的所有池中客户端下的连接。
softReset更温和:如果您愿意,您可以只重置一个池,而且客户端下面的连接不是close()
,客户端可以继续正常使用它们然后安静地丢弃它们而不是返回它们到了游泳池。
[请注意,如果您调用了getConnection( user, password )
,那么一个c3p0 DataSource可以管理多个池,以及getConnection()
。必须将针对不同用户进行身份验证的连接分隔到不同的池中。]
你很可能会打电话给softResetAllUsers()
。只需将c3p0数据源转换为PooledDataSource
(在com.mchange.v2.c3p0
中)并调用该方法。