1

我们正在构建一个产品,所以从性能的角度来看,我需要一些帮助。我们正在使用完整的 Spring(MVC、JPA、Security 等)

我们有一个要求,即对于一个特定的流程,可以同时执行 100 个业务规则。可以有n许多这样的流程和业务规则。

这些规则在执行时实际上是从数据库中的表中获取记录,这些也将包含很少的 LAZILY INITIALIZED ENTITIES。

我将Futures/Callables用于多线程目的,但问题是它无法加载 LAZY 变量。它给 Hibernate 加载异常,可能是 TRANSACTIONAL 中的一些问题没有分布在不同的线程中。

请让我知道是否有其他方法可以接近?

4

2 回答 2

1

如果某些实体/实体集合是延迟获取的,并且您正在另一个线程中访问它,您将面临LazyInitialization异常,因为延迟加载的实体只能在事务中访问,并且事务不会跨越线程。

您可以使用 DTO 模式,或者如果您跨线程共享实体,请在事务中调用其惰性初始化集合 getter,以便在事务本身中获取它们。

于 2012-11-09T16:39:53.600 回答
0

如果您真的需要异步处理,那么我建议您使用 Java EE 指定的方式,即使用JMS / MDB

无论如何,因为您似乎希望无论如何都希望加载所有数据以进行处理。所以Eager 获取所有需要的数据,然后提交数据进行并行处理。或者让每个Tasks( Callables) 获取他们需要的数据。本质上,我要求您更改您的设计,以便事务边界不会跨越多个线程。在单个线程内本地化边界。

于 2012-11-09T16:51:36.413 回答