gpt4 book ai didi

java - 带 session 的异步服务

转载 作者:行者123 更新时间:2023-11-30 08:59:51 25 4
gpt4 key购买 nike

我有一个调用存储函数的方法。我希望它异步地完成它的工作。这就是我所拥有的,但似乎 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com