线程名:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0
每次跑完程序后,都会出现一大堆等待线程,初步怀疑数据库连接使用后没有被关闭;以下是我的代码和配置,请过来人帮着看一眼,谢谢
@Bean(destroyMethod="close")
public DataSource dataSource() {
return this.getDS(Jdbc.JDBC_URL, Jdbc.JDBC_DRIVER_CLASS_NAME, Jdbc.JDBC_USER_NAME, Jdbc.JDBC_PWD);
}
c3p0配置:
private DataSource getDS(String url,String driver,String username,String pwd){
try {
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setJdbcUrl(url);
cpds.setDriverClass(driver);
cpds.setUser(username);
cpds.setPassword(pwd);
cpds.setMinPoolSize(1);
cpds.setMaxPoolSize(20);
cpds.setInitialPoolSize(1);
//<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
cpds.setAcquireIncrement(1);
//获取connnection时测试是否有效
cpds.setTestConnectionOnCheckin(true);
//自动测试的table名称
cpds.setAutomaticTestTable("C3P0TestTable");
//set to something much less than wait_timeout, prevents connections from going stale
cpds.setIdleConnectionTestPeriod(18000);
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
cpds.setMaxIdleTime(25000);
return cpds;
} catch (PropertyVetoException e) {
e.printStackTrace();
return null;
}
}
获得数据源方法:
@Bean(destroyMethod="close")
public DataSource dataSource() {
return this.getDS(Jdbc.JDBC_URL, Jdbc.JDBC_DRIVER_CLASS_NAME, Jdbc.JDBC_USER_NAME, Jdbc.JDBC_PWD);
}
//配置bean方法
<a href="http://my.oschina.net/bean" class="referer" target="_blank">@Bean</a> public UserDao userDaoService() {
return UserDao.getInstance(dataSource());
}
userDao
public class UserDao {
private static JdbcTemplate jdbcTemplate = null;
private static DataSource ds = null;
static class UserDaoHolder {
static UserDao instance = new UserDao();
}
public static UserDao getInstance(DataSource dataSource) {
ds = dataSource;
return UserDaoHolder.instance;
}
private UserDao(){
//初始化jdbc模板
jdbcTemplate = new JdbcTemplate(ds);
}
}
使用userDao
public class WzJob implements Job {
private ApplicationContext ctx = null;
private WzDao wzDao = null;
private UserDao userDao = null;
public WzJob(){
ctx = new AnnotationConfigApplicationContext(AppConfig.class);
wzDao = ctx.getBean(WzDao.class);
userDao = ctx.getBean(UserDao.class);
}
}
这种调用和配置有啥问题吗?
为啥每次执行操作后,都留了一大堆的等待线程,起初以为是httpClient使用完毕后没有关闭,后来发现是com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0
这个线程,不行的话,我不用连接池了,改用手动控制连接
你每次调用getDS都会new一个ComboPooledDataSource,这个类应该只保留一个实例即可,和线程池的使用无关。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。