如果只是为了搜索,是否值得将实体放在@Transactional服务层下?

时间:2013-05-02 17:34:43

标签: java spring java-ee jpa ejb

在Spring MVC中,我将大多数JPA entity(来自域层)操作放在service层下,对于大多数CRUD操作,我必须创建该服务方法或类{{ 1}}。

但是,只是想,如果是常规的查找方法,就像

@Transactional

所以问题是:

  1. 我们需要将它放在@Transactional方法下吗?
  2. 如果没有必要,但我们仍然这样做,是否有任何性能成本?
  3. 如果没有必要,为什么不将调查器方法调用到控制器中?

2 个答案:

答案 0 :(得分:1)

简单答案:

  

我们需要将它放在@Transactional方法下吗?

没有

  

如果没有必要,但我们仍然这样做,是否有任何性能成本?

是的,您正在打开一个事务并在不需要它时将其关闭(请注意,对数据库的影响取决于RDBMS供应商)。

  

如果没有必要,为什么不将调查器方法调用到控制器中?

你可以做到,但IMO你不应该因为你可以打破分层结构。针对数据源(在本例中为数据库)的操作必须在DAO层中完成,而不是在服务层中完成。

答案 1 :(得分:1)

有很多事情可以促成这个决定。

1)您使用的是开放式entityManager过滤器,还是处于自动提交模式?

如果您没有打开的持久性会话,那么每次在自动提交模式下执行持久性操作时,您都会从头开始构建一个全新的持久性操作,然后将其删除。这可以快速加起来。在这种情况下,将特定控制器所做的所有读取分组到单个事务中是很有用的,即使它“不优雅”并且破坏了SpringMVC提供的“漂亮”抽象。

2)您的JPA方言是否支持readOnly交易?

与在自动提交模式下运行查询相比,

@Transactional(readOnly = true)可以提升性能,尤其是在加载大量实体​​的情况下。

3)你有分发交易吗?

联系JTA服务器并启动分布式事务可能不值得进行本地原子读取。

4)结果是否可能被缓存?

当您使用Spring声明性事务时,Spring会在持久性提供程序知道预期操作是什么之前获取数据库连接并启动事务。如果结果实际上位于持久性提供程序的内存中,并且不需要与数据库进行此特定操作的对话,那可能会浪费一些力气。 (担心这是非常激进的微优化IMO,如果应用服务器开始变得重要,它可能会非常饱和。)