在读取方法上使用@Transactional 摆脱 "No Hibernate Session bound to thread" 和性能
Getting rid of "No Hibernate Session bound to thread" and performances with @Transactional on read methods
我的项目中引入了HibernateTransactionManager,因为我们需要对一些服务方法使用事务。我还遵循了将 SessionFactory 注入 DAO 层而不是实现 HibernateDaoSupport 的最佳实践。
现在在一些没有用@Transactional 注释的读取方法中我得到了错误:
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
我知道如何解决它,只需在各处添加@Transactional 即可。但是我的同事们担心性能。还应该阅读以下方法:
return sessionFactory.getCurrentSession().createCriteria(MyClass.class).add(Restrictions.eq("color", color)).addOrder(Order.asc("createDate")).list();
用@Transactional 注释?
我也读过这个 post Some clarification about Spring @Transactional annotation on a method 不鼓励在 DAO 层中使用这个注释,所以我看不出解决这个问题的最佳实践是什么 并且在读取方法上有很好的表现。
非常感谢您的帮助!
当您使用 Spring TransactionManager 抽象时,您必须始终将所有服务方法标记为:
@Transactional
@Transaction(readOnly = true)
对于只读方法
那是因为 Hibernate 将不再管理事务,而是将此职责委托给 Spring 框架。除非您使用 @Transactional
注释标记每个事务边界方法,否则 Spring 无法将当前线程与 Hibernate 会话和关联的 JDBC 连接相关联。
因此,使用 @Transactional
不是一个选项。
我的项目中引入了HibernateTransactionManager,因为我们需要对一些服务方法使用事务。我还遵循了将 SessionFactory 注入 DAO 层而不是实现 HibernateDaoSupport 的最佳实践。
现在在一些没有用@Transactional 注释的读取方法中我得到了错误:
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
我知道如何解决它,只需在各处添加@Transactional 即可。但是我的同事们担心性能。还应该阅读以下方法:
return sessionFactory.getCurrentSession().createCriteria(MyClass.class).add(Restrictions.eq("color", color)).addOrder(Order.asc("createDate")).list();
用@Transactional 注释?
我也读过这个 post Some clarification about Spring @Transactional annotation on a method 不鼓励在 DAO 层中使用这个注释,所以我看不出解决这个问题的最佳实践是什么 并且在读取方法上有很好的表现。
非常感谢您的帮助!
当您使用 Spring TransactionManager 抽象时,您必须始终将所有服务方法标记为:
@Transactional
@Transaction(readOnly = true)
对于只读方法
那是因为 Hibernate 将不再管理事务,而是将此职责委托给 Spring 框架。除非您使用 @Transactional
注释标记每个事务边界方法,否则 Spring 无法将当前线程与 Hibernate 会话和关联的 JDBC 连接相关联。
因此,使用 @Transactional
不是一个选项。