我有一个Java ThreadPool,初始化如下:
ThreadFactory tFactory = new DatabaseWorkerThreadFactory();
final ExecutorService dbService = new ThreadPoolExecutor(1, 5, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tFactory);
然后像这样
在该线程池上执行Runnable TaskexecutorService.execute(new RunnableDbInsertTask(netData));
让这些插入与我的其余代码保持异步。
由于我使用ActiveJDBC作为ActiveRecord实现,我需要每个工作者都有一个活动的Connection,我在RunnableDbInsertTask
的{{1}}方法的开头有这个代码:< / p>
run()
因此,当使用if(!Base.hasConnection())
Base.open(params);
时,每个获得任务的新生成ThreadPoolExecutor
将具有唯一的连接,并将为每个连接重复使用它。
现在我希望线程数量回退到最小值(1),如Thread
构造函数中指定的那样,当没有要完成的任务时。
为了正确发生这种情况,我需要当ThreadPoolExecutor's
由于不活动而自动完成一个线程时,它会自动完成调用ActiveJDBC的ThreadPoolExecutor
方法的连接
作为一种解决方案,我尝试重写Base.close()
方法,但这没有用。
任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
我认为您不应该依赖执行程序来打开和关闭您的连接。您需要使用连接池并从池中打开连接,而不是打开与数据库的直接连接。此外,在run()
方法的末尾,您必须关闭连接。由于这些是轮询连接,因此真正的JDBC连接将简单地返回池而不是关闭。这是preudo代码:
public void run() {
try {
Base.open("myConnectionJNDIName");
//do some real work here
} finally {
Base.close();//always close connection
}
}
通过这种方式,您可以更好地控制线程数与连接数。