我有一个非常简单的问题。我正在重写非常旧的应用程序,它通过DAO对象使用直接访问数据库。没有业务层(代码不是我的,并且非常反码),因此connection.setAutoCommit(false)用于在代码中的任何位置启动事务。由于安全原因,我不得不重写项目,因此它不使用数据库连接,而是使用J2EE服务器端的webservices和hibernate / jpa(在它是独立应用程序之前,现在是app + j2ee)。简单 - 我只是将DAO / VO对象移动到webservice服务器并将sql重写为客户端替换为webservice客户端的hql和DAO。
但是如何处理交易代码?通常一个事务一个webservice调用。所以我需要一些机制(webservices中的参数?),它可以帮助我跨多个webservice调用引用相同的hibernate事务。这是完全糟糕的方法,我应该只在服务器代码中移动事务吗?
答案 0 :(得分:1)
我认为您应该使用SessionBeans公开作为JAX-RS服务,并让它们控制事务。 如果您需要在多个Web服务调用中进行事务处理,只需定义一个新的Web服务,以及充当其他调用的外观的EJB SessionBean。 我认为实现你的建议(通过引用相同的hibernate事务)是一种不好的做法,我认为它甚至可能不可能。每个WS调用都是一个单独的线程,在不同的时刻,跨线程混合事务不是一个好习惯。
答案 1 :(得分:1)
我也认为这是不好的做法,因为您通常会构建粗粒度的Web服务方法。所以通常每次交易都有一个请求就可以了。
我可以理解你的需要,但想想缺点:
您是否尝试将交易置于一个请求中?这可能有助于重新构建并可能增强应用程序的代码。