读取查询时休眠@Transactional(readOnly=true) 是一种不好的做法吗?
is hibernate @Transactional(readOnly=true) on read query a bad practice?
我使用 Spring(服务层和存储库)在 mysql 数据库上执行 CRUD 操作。
MyServiceImpl :
@Service
@Transactional
public class MyServiceImpl implements MyService {
private final MyRepository myrepo;
....
@Transactional(readOnly = true)
public Optional<myObj> findOne(Long id) {
return myrepo.findById(id);
}
}
对读取操作使用 readonly=true 是一种不好的做法吗?性能怎么样?
首先,由于 Spring 本身不进行持久化,因此只读只是对行为提供者的提示(例如 Hibernate)
根据 Hibernate 的行为 readonly=true
将在当前会话中设置 FlushMode.NEVER
,这将阻止提交事务。
如果您没有明确地将 readOnly 设置为 true,您将有 read/write 个事务。
现在回到你的问题
查看您的 findOne
方法。看起来您正在从数据库中进行读取调用。
所以最好将其标记为 readonly
,让您的提供商知道您只读。
您可以在此处详细阅读
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
Spring @Transactional read-only propagation
这是一个很好的优化实践。您可以在 Spring 数据文档中找到示例。而且您不需要使用 @Transactional 注释来注释您的整个服务,因为“..Spring Data JPA 存储库实现的 CRUD 方法已经使用 @Transactional 进行了注释”
Getting started with Spring Data JPA
我使用 Spring(服务层和存储库)在 mysql 数据库上执行 CRUD 操作。
MyServiceImpl :
@Service
@Transactional
public class MyServiceImpl implements MyService {
private final MyRepository myrepo;
....
@Transactional(readOnly = true)
public Optional<myObj> findOne(Long id) {
return myrepo.findById(id);
}
}
对读取操作使用 readonly=true 是一种不好的做法吗?性能怎么样?
首先,由于 Spring 本身不进行持久化,因此只读只是对行为提供者的提示(例如 Hibernate)
根据 Hibernate 的行为 readonly=true
将在当前会话中设置 FlushMode.NEVER
,这将阻止提交事务。
如果您没有明确地将 readOnly 设置为 true,您将有 read/write 个事务。
现在回到你的问题
查看您的 findOne
方法。看起来您正在从数据库中进行读取调用。
所以最好将其标记为 readonly
,让您的提供商知道您只读。
您可以在此处详细阅读
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
Spring @Transactional read-only propagation
这是一个很好的优化实践。您可以在 Spring 数据文档中找到示例。而且您不需要使用 @Transactional 注释来注释您的整个服务,因为“..Spring Data JPA 存储库实现的 CRUD 方法已经使用 @Transactional 进行了注释” Getting started with Spring Data JPA