我有两个申请。一个是OrderService,另一个是TradeService。 在交易服务中,有一种方法'买'是交易性的。
当Trade Service使用Web服务调用Order服务的SubmitOrder方法时会出现问题。
问题描述:
Buy方法中的所有步骤都在一个交易中。
当我们调用buy方法时,它会创建一个Order Object。
当此方法使用Web服务调用Submit Order方法时,它会传递订单ID。
提交订单方法使用此ID从DB加载订单对象。
但是在Load方法中它给出了Lazy Initialization Exception:Session已关闭。 (两个应用程序共享相同的数据库)
可能的解决方法是使提交订单方法成为交易。
导致另一个死锁问题。
注意:两个应用程序都使用Spring MVC,Spring Web Service和Hibernate。
请帮助我摆脱这种情况。在此先感谢。(如果需要,我可以发布部分代码)
答案 0 :(得分:0)
通常,无法在Web服务调用的两端使用相同的数据库事务。 - 通过Web服务传输连接至少是不可能的。
所以你必须接受这样一个事实:你有/需要两个数据库事务。每边一个。 - 除此之外(导致您的Lazy Initialization Exception),如果Web服务 - 服务器端重新接收实体,它不会附加到任何会话,因此如果您尝试访问尚未加载(layz加载)属性然后得到这个layz加载例外。
您需要做的是,先打开一个交易,然后将实体首先附加到此交易中。
答案 1 :(得分:0)
为什么TradeService会创建订单?我希望这是OrderService的责任。这样就不会争用相同的资源。
是的,这两项服务都应该是交易性的。您将获得LazyInitializationException,因为您的load方法可能需要进行2次单独的数据库调用来构建Order实例,并且在第一次数据库调用后会话已关闭。