对于Spring中的只读查询,@ Transnsal(readOnly = true)的替代方法是什么?

时间:2012-04-25 21:37:32

标签: spring hibernate

我正在使用Spring和Hibernate。我有一些实际上不需要事务的查询,但我使用的是因为它为我进行会话管理。在不进行自己的会话管理的情况下,执行这些非事务性读取查询的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

我认为@Transaction(readOnly = true)正确的做法。这不会创建新的/额外的物理事务,因此使用它不应该有任何开销。它将使用已为请求设置的事务。根据Hibernate文档:

  

...实际上,每个SQL语句,无论是查询还是DML,都必须在数据库事务中执行。在数据库事务之外不能与数据库进行通信。 (请注意,有些只读事务可用于改善数据库引擎中的清理时间,如果它不够智能,无法优化自己的操作。)

https://community.jboss.org/wiki/SessionsAndTransactions#Transactions

答案 1 :(得分:1)

如果没有与数据库的交易,你就无法工作(嗯,有,但是很少见的情况是驱动程序支持NO_TRANSACTION模式,如DB2驱动程序)。此外,驱动程序和数据库可能不支持只读事务(如Oracle)。因此,即使底层连接设置为只读模式,这并不意味着它会产生影响。

在这种情况下唯一确定只读标志的是它将Hibernate的刷新模式设置为MANUAL。这意味着除非发出对Session#flush()的显式调用,否则Hibernate将不会与数据库同步。因此,在交易结束时不会发出脏检查和插入/更新/选择。

有关事务管理的更准确信息,您可以查看org.springframework.orm.hibernate3.HibernateTransactionManager#doBegin()方法。