我有一个方法可以调用存储的函数。我希望它能够异步并完成它的工作。这就是我所拥有的,但似乎永远不会启动.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"
为什么会发生这种情况?
答案 0 :(得分:2)
请注意,当您拥有单独的线程时@Transaction
没有意义,因为事务通常是线程绑定的。
您需要在run()内从工厂获取新的entityManager
。
还可以选择更清洁的@Async。
再次注意与@Async
@Async and @Transactional: not working
作为一般的经验法则,如果您想让某些工作异步 - 将其视为单个工作单元和单独的事务。