如何使用Guice和Jersey在GET请求中配置只读事务?

时间:2011-10-09 08:30:05

标签: transactions jersey guice guice-persist

我正在使用Guice,Guice Persist,Hibernate和Jersey。除了使用@GET注释的方法之外,我的所有资源方法都使用@Transactional进行注释。这是配置每个请求事务范围的正确方法吗?

1 个答案:

答案 0 :(得分:4)

没有“正确”的方式;这取决于你想要达到的目标。如下所述,回答您的问题涉及一些单独的问题。

  1. 数据访问模式:企业Java中的传统模式是让您的控制器调用处理持久性的DAO(数据访问对象)。在此模式中,您的事务注释将放在DAO方法上,而不是您的控制器方法上。然而,许多人发现DAO过度,并且更喜欢将实体管理器注入控制器。这是一个完全可以接受的替代方案,据我所知,这是您选择的方法。
  2. 线程安全:您必须知道实体管理器实例不是线程安全的,因此您的控制器不能是单例,必须是请求范围的。换句话说,您不能跨多个请求共享实体管理器,因此您必须将控制器设置为重新创建,并为每个请求注入新的实体管理器。
  3. 事务:如果您的数据检索操作只需要一个查询,则不需要事务。但是,构建完整的对象图通常需要许多查询。在这种情况下,您的检索必须是事务性的,以保证一致性,因为数据可能会在查询之间发生变化。有些框架实际上要求所有数据库访问都是事务性的,否则实体管理器将无法正确注入。
  4. 总之,只要您的控制器是请求范围的,您的数据访问模式就可以了。但是,如果在创建对象图时涉及许多查询,则“GET”函数应该是事务性的。