Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导将事务(和db连接)传播到@Async方法_Java_Spring_Multithreading_Spring Boot_Spring Transactions - Fatal编程技术网

Java Spring引导将事务(和db连接)传播到@Async方法

Java Spring引导将事务(和db连接)传播到@Async方法,java,spring,multithreading,spring-boot,spring-transactions,Java,Spring,Multithreading,Spring Boot,Spring Transactions,我们遇到了以下问题:我们得到了一些服务bean,它执行一些处理,并将在集合上迭代,并为每个条目启动一个异步线程,如下所示: @Service public class ServiceBean { @Autowired private AsyncHandler asyncHandler; public void doService(Set<?> theSet) { for (Object obj : theSet) { Future<?>

我们遇到了以下问题:我们得到了一些服务bean,它执行一些处理,并将在集合上迭代,并为每个条目启动一个异步线程,如下所示:

@Service
public class ServiceBean {
  @Autowired
  private AsyncHandler asyncHandler;

  public void doService(Set<?> theSet) {
    for (Object obj : theSet) {
      Future<?> future = asyncHandler.doHandle(obj);
      // ...
    }
    // wait for all futures to complete
  }
}

@Service
public class AsyncHandler {
  @Async
  public Future<?> doHandle(Object object) {
    // dosth
    return future;
  }
}
@服务
公共类ServiceBean{
@自动连线
私有异步处理程序;
公共无效数据服务(设置此集合){
对于(对象对象:主题集){
Future=asynchHandler.doHandle(obj);
// ...
}
//等待所有期货交易完成
}
}
@服务
公共类异步处理程序{
@异步的
公共未来doHandle(对象){
//多斯
回归未来;
}
}
现在我们看到,每个线程都将保存自己的事务,从而保存数据库连接,这将导致连接池很快空运行

在所有线程之间共享事务帐户的理想方式是什么

提前谢谢

在所有线程之间共享事务帐户的理想方式是什么

不要那样做。这使得我们很难理解到底发生了什么。事务被附加到创建它的线程是有原因的。我猜您的计划是启动所有这些异步线程,然后等待它们完成以发送提交信号

如果你没有,谁来完成交易?如果一个线程回滚事务,那么在其他仍在使用它的线程中会发生什么?显然,您可以传递
连接
,但我希望无论如何都可以序列化,因为大多数连接实现都在不同的地方使用
同步

在所有线程之间共享事务帐户的理想方式是什么

不要那样做。这使得我们很难理解到底发生了什么。事务被附加到创建它的线程是有原因的。我猜您的计划是启动所有这些异步线程,然后等待它们完成以发送提交信号


如果你没有,谁来完成交易?如果一个线程回滚事务,那么在其他仍在使用它的线程中会发生什么?显然,您可以传递
连接
,但我希望无论如何都可以序列化,因为大多数连接实现都在不同的地方使用
同步

您不能。事务和连接存储在ThreadLocal中。不能让事务跨越多个线程。限制并发线程的数量是最简单的解决方案。。。我打赌你可以,也许定制弹簧是必要的。当事务位于ThreadLocal中时,可以在新的thread.M中获取并设置它。Dienum更正我已删除我的答案。除非您正在传递连接和事务状态,否则您不能。您需要重新实现整个事务策略。有了开箱即用的支持,你根本无法做到这一点。事务和连接存储在ThreadLocal中。不能让事务跨越多个线程。限制并发线程的数量是最简单的解决方案。。。我打赌你可以,也许定制弹簧是必要的。当事务位于ThreadLocal中时,可以在新的thread.M中获取并设置它。Dienum更正我已删除我的答案。除非您正在传递连接和事务状态,否则您不能。您需要重新实现整个事务策略。有了开箱即用的支持,您根本无法实现这一点。