开发者社区> 问答> 正文

这个c3p0的线程是怎么回事?为什么总是等待状态,我关闭了啊

线程名:

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
这个线程,不行的话,我不用连接池了,改用手动控制连接

展开
收起
a123456678 2016-03-13 13:21:54 3893 0
1 条回答
写回答
取消 提交回答
  • 你每次调用getDS都会new一个ComboPooledDataSource,这个类应该只保留一个实例即可,和线程池的使用无关。

    2019-07-17 19:02:27
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载