Tomcat中的c3p0数据库连接池的释放

摘要:
//初始化连接池相关参数static{try{dataSource=newComboPooledDataSource();552)java.util.TimerThread.run(Timer.java:

一个项目通过c3p0获得连接池,相关代码如下:

public class JdbcUtil {
	
	// 连接池的核心类
	private static ComboPooledDataSource dataSource;
	
	//初始化连接池相关参数
	static{
		try {
			dataSource = new ComboPooledDataSource();
			dataSource.setDriverClass(PropertiesUtil.getValue("jdbcName"));
			dataSource.setJdbcUrl(PropertiesUtil.getValue("dbUrl"));
			dataSource.setUser(PropertiesUtil.getValue("dbUserName"));
			dataSource.setPassword(PropertiesUtil.getValue("dbPassword"));
			dataSource.setInitialPoolSize(5);
			dataSource.setMinPoolSize(5);
			dataSource.setMaxPoolSize(20);
			// 以下两句用于设置自动重连
			dataSource.setIdleConnectionTestPeriod(10);
			dataSource.setTestConnectionOnCheckin(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
        //下面是getDataSource,getConnection等方法
}

关闭Tomcat的时候提示可能会造成内存泄漏

警告: The web application [uavmonitor] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.util.TimerThread.mainLoop(Timer.java:552)
 java.util.TimerThread.run(Timer.java:505)
二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)

主要是这句:

警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)

与这句

The web application [uavmonitor] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.util.TimerThread.mainLoop(Timer.java:552)
 java.util.TimerThread.run(Timer.java:505)

查询c3p0官方文档

说明如下:c3p0 spawns a variety of Threads (helper threads, java.util.Timer threads),结合上面的出错信息,推断应该是Tomcat关闭的时候没有关闭JdbcUtil类创建出来的c3p0的datasource。

解决方案

写一个监听器,在其public void contextDestroyed方法中进行对c3p0数据源进行关闭就可以解决相关问题。

try {		
	DataSources.destroy(JdbcUtil.getDataSource());//getDataSource方法获取c3p0数据源
	System.out.println("关闭数据库连接池成功!");
} catch (SQLException e) {
	e.printStackTrace();
}

如果运行在Tomcat中的代码启动了Executor线程池,也需要在适当的地方(比如监听器中的contextDestroyed方法)进行shutdown,否则会造成资源泄露。

从这个例子中也可以看出,直接使用spring、mybatis等管理数据源是多么省事。

免责声明:文章转载自《Tomcat中的c3p0数据库连接池的释放》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue里在自定义的组件上定义的事件centos7安装oracle 11g下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

视频编码 率失真性能评价指标:PSNR SSIM BD-rate BD-PSNR

BD-rate 算法 参考 BD-rate,全称Bjøntegaard-Delta rate, 用于评价不同的视频编码器RD(率失真)性能。 写这篇博客,部分原因是发现BD-rate的中文解释完全没有。 算法 1. 一个编码器,给定bitrate,计算PSNR(以Y为例)。取不同的bitrate,在R-D曲线得到四个点。 2. 用三次多项式拟合R-D...

Handler处理长时间事件

当我们在处理一些比较长时间的事件时候,比如读取网络或者数据库的数据时候,就要用到Handler,有时候为了不影响用户操作应用的流畅还要开多一个线程来区别UI线程,在新的线程里面处理长时间的操作。开发的时候遇到数据处理都可以这样用handler,灵活修改一下就可以做各种效果了。 第一步:ProgressDialog弹出旋转框来提示长时间操作。 第二步:开多一...

css hover伪类选择器与JQuery hover()方法

css hover伪类选择器 它属于anchor伪类 在支持 CSS 的浏览器中,<a>标签链接的不同状态都可以以不同的方式显示,常常用来改链接的颜色效果 实例 a:link{color:#FF0000;}/* 未访问的链接 */ a:visited{color:#00FF00;}/* 已访问的链接 */ a:hover{color:#FF...

命名空间“System.Windows”中不存在类型或命名空间名“Forms”(是否缺少程序集引用?) ——c#

原因: 新建项目为类库时,项目不会自动引用System.Windows.Forms,当我们使用命名空间System.Windows.Forms时,就会报这个错误 解决方法: 右键引用——添加引用——框架——搜索System.Windows.Forms添加即可...

RabbitMQ---6、客户端 API 的简介

1、主要的命名空间,接口和类  定义核心的API的接口和类被定义在RabbitMQ.Client这个命名空间下面:  所以要想使用RabbitMQ的功能,需要以下代码     using RabbitMQ.Client;   【1】、核心API的接口和类如下:    IModel:表示一个符合AMQP 0-9-1 协议的通道,并且提供了很多的操作方法   ...

C#系列之聊聊.Net Core的InMemoryCache

个人博客:http://www.boydwang.com/2017/12/net-core-in-memory-cache/ 这两天在看.net core的in memory cache,这里记录一下用法,主要涉及MemoryCache的Get/Set/Expire/Flush。首先我们先用dotnet命令创建一个mvc的项目,这里我们将使用post...