我有一个java应用程序,它每隔几分钟从脚本中调用一次。流动情况如下:
每次我们从池中获得连接时,我们都会调用close()。我们还将unreturnedConnectionTimeout设置为20,以便每当连接关闭太久或不关闭时,c3p0都会处理它。
我的问题是,一旦步骤2中的所有处理都完成了,在我们通过调用System.exit(0)退出之前,我们需要清理连接池吗?
我知道使用连接池调用close()只会将连接返回给池,而不会真正“关闭”连接。所以,在离开之前,我需要清理康涅狄格州的游泳池吗?如果我不进行任何清理并执行JVM退出,到DB的连接是否仍在徘徊,还是c3p0清理/强制关闭它们?谢谢!
发布于 2013-09-10 21:22:40
如果使用的是com.mchange.v2.c3p0.PooledDataSource实例(例如com.mchange.v2.c3p0.ComboPooledDataSource ),则可以使用com.mchange.v2.c3p0.DataSources.destroy()方法。
这种方法:
立即释放由C3P0 DataSource保存的资源(线程和数据库连接)。 只有由DataSources ()方法创建的poolingDataSource()保存任何非内存资源。在非池DataSources上调用此方法实际上是一种不操作。 您可以放心地假设,破坏包装在由该库创建的另一个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()方法是最好的选择,因为它更明显。关闭资源总是明智的。连接在数据库中可能会保持一段时间的打开,但在超时之后,将关闭。此行为取决于数据库供应商。
https://stackoverflow.com/questions/18728503
复制相似问题