【发布时间】:2015-09-17 14:51:11
【问题描述】:
许多 JDBC 调用(查询 DB 和获取结果)都是通过 ExecutorService 执行的。我发现当执行这些调用时,JDBC 连接需要很长时间才能关闭连接,即使这些连接已正确关闭。为什么我这么说是,当通过JMeter运行负载测试时,数据库显示很多连接在IDLE in transaction。如果运行测试的线程数很高,则事务中空闲的连接数会增加。如果测试运行缓慢,则连接会慢慢关闭(1、2 分钟),这意味着事务中有 IDLE 连接,但几分钟后它们变为 IDLE。我也在这里使用连接池。如果我将 JDBC 查询函数作为一个序列(一个接一个)运行,那么数据库不会在事务中的 IDLE 中显示任何连接。下面是我如何运行运行 JDBC 查询的可运行任务。 TaskManager 类处理整个 ExecutorService 相关的功能。
public class TaskManager {
final private ThreadServiceFactory threadFactory;
private int concurrentThreadCount;
private ExecutorService executerSV;
private final CountDownLatch latch;
// I keep a count of proposed tas task as servicecount
public TaskManager(int serviceCount) {
threadFactory = new ThreadServiceFactory();
this.concurrentThreadCount = serviceCount;
latch = new CountDownLatch(serviceCount);
}
public void execute( ThreadService runnableTask) {
Object rv = null;
runnableTask.setCountDownLatch(latch);
if(executerSV == null) {
executerSV = Executors.newFixedThreadPool(this.concurrentThreadCount, getThreadFactory());
}
executerSV.execute(runnableTask);
}
public boolean holdUntilComplete(){
try {
latch.await();
executerSV.shutdown();
return true;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
private ThreadServiceFactory getThreadFactory(){
threadFactory.setDeamon( Boolean.FALSE);
return threadFactory;
}
}
在我的测试课上;
public void test(){
TaskManager tm = new TaskManager(3);
tm.execute(queryTask1);
tm.execute(queryTask2);
tm.holdUntilComplete();
}
queryTask1 是一个 Runnable,它调用 JDBC 选择查询。
如果我运行queryTask1.run(); queryTask2.run();,那么数据库中的连接中没有任何空闲。
我使用java 7。请任何人告诉我问题出在哪里。
【问题讨论】: