我有一个方法将调用存储的函数。我希望它能够异步完成其工作。这就是我所拥有的,但似乎 .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”
为什么会发生这种情况?
最佳答案
请注意,当您有单独的线程时,@Transaction
是没有意义的,因为事务通常是线程绑定(bind)的。
您需要从 run() 内的工厂获取一个新的 entityManager
。
也可以选择@Async,它更干净。
再次注意 @Async
的事务性
@Async and @Transactional: not working
作为一般经验法则,如果您想让某些工作异步 - 将其视为单个工作单元和单独的事务。
关于java - 带 session 的异步服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27066098/