0

我有一个初始化如下的Java ThreadPool:

ThreadFactory tFactory = new DatabaseWorkerThreadFactory();
final ExecutorService dbService = new ThreadPoolExecutor(1, 5, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tFactory);

然后像这样在该线程池上执行 Runnable Task

executorService.execute(new RunnableDbInsertTask(netData));

使这些插入与我的其余代码异步。

当我使用 ActiveJDBC 作为 ActiveRecord 实现时,我需要每个工作人员都有一个活动的连接,我在RunnableDbInsertTask'srun()方法的开头有这个代码:

if(!Base.hasConnection())
        Base.open(params);

因此,当ThreadPoolExecutor使用 时,每个Thread获得任务的新生成的都会有一个唯一的连接,并且会为每个连接重用它。

ThreadPoolExecutor's现在,当没有要完成的工作时, 我希望线程数量回退到构造函数中指定的最小值 (1) 。

为了正确地发生这种情况,我需要当一个线程ThreadPoolExecutor由于不活动而自动完成时,它会自动完成它的连接调用 ActiveJDBC 的Base.close()方法

作为解决方案,我尝试了覆盖DatabaseWorker.interrupt()方法,但没有奏效。

任何帮助表示赞赏。谢谢!

4

1 回答 1

1

我认为你不应该依赖执行者来打开和关闭你的连接。您需要使用连接池并从池中打开一个连接,而不是打开与数据库的直接连接。此外,在您的run()方法结束时,您必须关闭连接。由于这些是轮询连接,因此真正的 JDBC 连接将简单地返回池而不是关闭。这是preudo代码:

public void run() {        
    try {
        Base.open("myConnectionJNDIName");
        //do some real work here
    } finally {
        Base.close();//always close connection
    }
}

这样,您可以更好地控制线程数与连接数。

于 2014-06-18T18:54:58.433 回答