【发布时间】:2015-01-19 21:05:08
【问题描述】:
我有一个要调用存储函数的方法。我希望它异步完成它的工作。这就是我所拥有的,但似乎 .doWork() 从未启动,因为当我调用 getDao.deleteAll() 时,存储的函数没有运行。
@Transactional
public void delete()
{
final Session session = (Session) entityManager.getDelegate();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable()
{
@Override
public void run()
{
LOGGER.warn("starting");
session.doWork(new Work()
{
@Override
public void execute(Connection connection) throws SQLException
{
try
{
CallableStatement purgeArchived = connection.prepareCall("{call deleteAll()}");
purgeArchived.execute();
}
catch (SQLException exception)
{
LOGGER.warn("Failed to purge archive points. Reason: " + exception);
}
}
});
LOGGER.warn("stopping");
}
});
executorService.shutdown();
}
我看到记录器已经记录了"starting",但它从未到达"stopping",为什么会发生这种情况?
【问题讨论】:
-
尝试在
run方法中移动final Session session = (Session) entityManager.getDelegate();。 -
刚刚试过,没成功
-
在
executorService.shutdown();之后尝试使用while (!executorService.isTerminated()) { }。这将使当前线程等待,直到ExecutorService中的线程完成。这是出于测试目的,因为如果它在这里结束,则意味着问题出在初始化该线程的主线程中。 -
问题出在:CallableStatement purgeArchived = connection.prepareCall("{call deleteAll()}");我把记录语句放在后面,prepareCall 被记录后什么都没有。不知道为什么..
-
似乎连接正在关闭,而另一个线程仍在工作。这是您在管理线程和外部线程管理连接的打开和关闭时遇到的问题。