我使用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是一种不好的做法吗?性能如何?
答案 0 :(得分:1)
这是一个好的优化实践。您可以在Spring Data文档中找到示例。而且,您不需要使用@Transactional注释来注释整个服务,因为“ Spring Data JPA存储库实现的..CRUD方法已经使用@Transactional进行了注释”。 Getting started with Spring Data JPA
答案 1 :(得分:0)
首先,由于Spring本身不会执行持久性,因此readonly仅是提供者有关行为的提示(例如Hibernate)
根据Hibernate的行为,readonly=true
将在当前会话中设置FlushMode.NEVER
,这将阻止提交事务。
如果未将readOnly显式设置为true,则将具有读/写事务。
现在回到您的问题
查看您的findOne
方法。看起来您正在从数据库进行Read调用。
因此,最好将其标记为readonly
,以使您的提供者知道您正在阅读。
您可以在此处详细了解更多
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html