我有一个java应用程序,每隔几分钟从脚本调用一次。流程是:
每当我们从池中获得连接时,我们都会调用close()
。我们还将unreturnedConnectionTimeout
设置为20
,以便每当连接有太长时间或未关闭时,c3p0都会处理它。
我的问题是,一旦步骤2中的所有处理完成,并且在我们通过调用System.exit(0)
退出之前,我们是否需要清除连接池?
我知道使用连接池调用close()
只会将连接返回到池,并且实际上不会“关闭”连接。所以在退出之前我需要对conn池进行任何清理吗?如果我不进行任何清理并执行JVM退出,那么与DB的连接是否仍然存在,或者c3p0是否清除/强制关闭它们?谢谢!
答案 0 :(得分:2)
如果您使用的是com.mchange.v2.c3p0.PooledDataSource
的实例(例如com.mchange.v2.c3p0.ComboPooledDataSource
),则可以使用com.mchange.v2.c3p0.DataSources.destroy()
方法。
此方法:
立即释放由C3P0 DataSource保存的资源(线程和数据库连接)。
只有poolingDataSource()方法创建的DataSource才能保存任何非内存资源。在非池化数据源上调用此方法实际上是无操作。
您可以放心地假设销毁由此库创建的另一个DataSource包装的池化DataSource会破坏外部和包装的DataSource。没有理由持有对嵌套DataSource的引用,以便明确地销毁它。
PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do
DataSources.destroy(dataSource);
System.exit(0);
换句话说,(再次,如果您使用com.mchange.v2.c3p0.PooledDataSource
的实例),方法com.mchange.v2.c3p0.PooledDataSource.html#hardReset()
:
立即销毁与此DataSource关联的所有池化和签出的连接。 PooledDataSource在第一次连接获取之前被重置为其初始状态,没有任何池处于活动状态,但已为请求做好准备。
PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do
dataSource.hardReset();
System.exit(0);
方法dataSource.close()
是最佳选择,因为它更明显。始终建议关闭资源。连接可能会在数据库中保持打开状态,但在超时后关闭。此行为取决于数据库供应商。