首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java进程退出之前清理连接池

问在Java进程退出之前清理连接池
EN

Stack Overflow用户
提问于 2013-09-10 20:49:26
回答 1查看 6.4K关注 0票数 1

我有一个java应用程序,它每隔几分钟从脚本中调用一次。流动情况如下:

  1. 脚本每隔几分钟调用一次java进程。
  2. java程序运行几分钟(有时更少),进行一些处理,并通过调用System.exit(0)完成退出。
  3. 在步骤2中,为了进行处理,我们使用c3p0连接池连接到MySQL DB。

每次我们从池中获得连接时,我们都会调用close()。我们还将unreturnedConnectionTimeout设置为20,以便每当连接关闭太久或不关闭时,c3p0都会处理它。

我的问题是,一旦步骤2中的所有处理都完成了,在我们通过调用System.exit(0)退出之前,我们需要清理连接池吗?

我知道使用连接池调用close()只会将连接返回给池,而不会真正“关闭”连接。所以,在离开之前,我需要清理康涅狄格州的游泳池吗?如果我不进行任何清理并执行JVM退出,到DB的连接是否仍在徘徊,还是c3p0清理/强制关闭它们?谢谢!

EN

回答 1

Stack Overflow用户

发布于 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的引用来显式销毁它。

代码语言:javascript
复制
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被重置到第一次连接获取之前的初始状态,没有池活动,但准备好了请求。

代码语言:javascript
复制
PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do

dataSource.hardReset();

System.exit(0);

dataSource.close()方法是最好的选择,因为它更明显。关闭资源总是明智的。连接在数据库中可能会保持一段时间的打开,但在超时之后,将关闭。此行为取决于数据库供应商。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18728503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档