【问题标题】:Getting rid of "No Hibernate Session bound to thread" and performances with @Transactional on read methods摆脱“没有绑定到线程的休眠会话”和@Transactional 在读取方法上的性能
【发布时间】:2015-04-11 16:27:34
【问题描述】:

我在我的项目中引入了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 注释?

我也读过这篇文章Some clarification about Spring @Transactional annotation on a method,不鼓励在 DAO 层使用这个注释,所以我看不出解决这个问题的最佳实践是什么并且在读取方法上有良好的表现

非常感谢您的帮助!

【问题讨论】:

    标签: java spring performance hibernate transactions


    【解决方案1】:

    当您使用Spring TransactionManager 抽象时,您必须始终将所有服务方法标记为:

    • @Transactional
    • @Transaction(readOnly = true) 用于只读方法

    这是因为 Hibernate 将不再管理事务,而是将这个责任委托给 Spring 框架。除非您使用 @Transactional 注释标记每个事务边界方法,否则 Spring 无法将当前线程与 Hibernate Session 和关联的 JDBC Connection 关联。

    因此,使用@Transactional 不是一种选择。

    【讨论】:

    • 感谢弗拉德,所以 readOnly = true 为读取方法的良好性能铺平了道路,或者我应该期待性能下降。将这些注释引入我的所有方法?实际上,我正在阅读其他类似的帖子:stackoverflow.com/questions/27390963/… 建议在单独的服务中移动只读操作......你怎么看?
    • 只读事务注释没问题。它不会影响您的应用程序性能。通常,性能受不太理想的数据库查询的影响更大。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2023-03-11
    • 2011-10-25
    相关资源
    最近更新 更多