2015-06-30 212 views
0

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

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

回答

0

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

0

我也认为这是不好的做法,因为您通常会构建粗粒度的webservice方法。所以通常你没有问题,每个交易有一个请求。

我能理解你的需求,但想想缺点:

  • 你怎么会做一个关于几个事务回滚?这将引入数据不一致,如果不可能的话。
  • 如果这是可能的,你的web服务将不再是无状态的, 这通常被认为是不好的做法。
  • 这意味着,您的API请求将相互依赖,因此您有执行任何请求的先决条件。

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

+0

我会以其他方式做 - 重写所有事务代码,我将在内存中处理对象。如果成功,我会打电话给web服务。我试图避免这一点,因为它是在更高的成本..但是。 – Mejmo