最近刚换了新公司,想去优化一下之前的代码,提高一下任务执行效率,review了一下之前的代码,可以优化的地方挺多的,公司有一个查询db的sdk,被之前的同事用druid datasource 封装了一下, 看了一下sdk的实现,本身是有pooling的支持的,那么我就大刀阔斧的进行了代码的重构,本着有现成的就不过多的扩展(之前的代码实现的也不是太好,fork了堆无用的类,只为了封装druid)。
经过一顿修改之后打包测试,简单的sql可以,但是如果多线程并发下,会出现
程序卡死的情况,执行了一下jstack
jstack -l $PID
看了一下堆栈,发现程序卡在了其中一个countdownLatch的await()处,那么在分析,是上面那些操作没有执行完么,又看了一下日志,程序有25个线程都卡在了_pool.borrowObject()
处,连接拿完了?猜测有两种原因
- 慢查询,没有返回结果 (
show processList
以后发现没有慢查询占用) - 连接池用完没有回收
后来查了一下BasicDataSource默认参数是没有开启超时回收的,那么肯定就有问题了,后来加了一下,下面的参数顺利运行
BasicDataSource dataSource = (BasicDataSource)dataSource(jdbcParamsState);
dataSource.setInitialSize(10);
dataSource.setMinIdle(10);
dataSource.setMaxIdle(100);
dataSource.setMaxTotal(120);
dataSource.setMaxWaitMillis(30 * 1000); //关键