【发布时间】:2016-06-18 14:34:48
【问题描述】:
上下文:
- 这是一个
Jersey应用程序 - 在
Tomcat服务器上运行 - 使用
Hibernate连接到MySQL数据库 - 全部在
Netbeans
我正在创建一个ScheduledExecutorService 来每天在特定时间运行。但是,当它运行时,它会创建许多与数据库的连接。我想这是因为当我重新运行应用程序时线程没有被破坏,所以很多ScheduledExecutorServices 在 JVM 中建立并同时执行。但是,我不确定是什么原因。
我使用仅创建守护线程的ThreadFactory 创建ScheduledExecutorService,因此当我重新运行应用程序时,我想所有守护线程都应该被销毁,以便只存在一个ScheduledExecutorService。
这里是ScheduledExecutorService的创建:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
}
});
这是它每天在特定时间的运行方式:
public void startExecutionAt(int targetHour, int targetMin, int targetSec){
long delay = computeNextDelay(targetHour, targetMin, targetSec);
mExecutorService.schedule(new Runnable() {
@Override
public void run() {
Thread t = new Thread(new CustomRunnable());
t.setDaemon(false);
t.start();
startExecutionAt(targetHour, targetMin, targetSec);
}
}, delay, TimeUnit.SECONDS);
}
我知道它正在创建许多与MySQL 的连接,因为在P6Spy 日志中,当CustomRunnable 只运行一个Hibernate 查询从其中选择5 条记录时,执行CustomRunnable 时会产生许多连接和查询一张桌子。
对可能发生的事情有任何想法吗?
【问题讨论】:
标签: java multithreading hibernate