跨多个Web服务的事务

时间:2015-06-30 11:49:40

标签: java hibernate web-services jpa

我有一个非常简单的问题。我正在重写非常旧的应用程序,它通过DAO对象使用直接访问数据库。没有业务层(代码不是我的,并且非常反码),因此connection.setAutoCommit(false)用于在代码中的任何位置启动事务。由于安全原因,我不得不重写项目,因此它不使用数据库连接,而是使用J2EE服务器端的webservices和hibernate / jpa(在它是独立应用程序之前,现在是app + j2ee)。简单 - 我只是将DAO / VO对象移动到webservice服务器并将sql重写为客户端替换为webservice客户端的hql和DAO。

但是如何处理交易代码?通常一个事务一个webservice调用。所以我需要一些机制(webservices中的参数?),它可以帮助我跨多个webservice调用引用相同的hibernate事务。这是完全糟糕的方法,我应该只在服务器代码中移动事务吗?

2 个答案:

答案 0 :(得分:1)

我认为您应该使用SessionBeans公开作为JAX-RS服务,并让它们控制事务。 如果您需要在多个Web服务调用中进行事务处理,只需定义一个新的Web服务,以及充当其他调用的外观的EJB SessionBean。 我认为实现你的建议(通过引用相同的hibernate事务)是一种不好的做法,我认为它甚至可能不可能。每个WS调用都是一个单独的线程,在不同的时刻,跨线程混合事务不是一个好习惯。

答案 1 :(得分:1)

我也认为这是不好的做法,因为您通常会构建粗粒度的Web服务方法。所以通常每次交易都有一个请求就可以了。

我可以理解你的需要,但想想缺点:

  • 您如何对多笔交易进行回滚?如果不可能,这将引入数据不一致。
  • 如果可以,您的网络服务将不再是无国籍的, 这通常被认为是不好的做法。
  • 这意味着,您的API请求将相互依赖,因此您有执行任何请求的先决条件。

您是否尝试将交易置于一个请求中?这可能有助于重新构建并可能增强应用程序的代码。