gpt4 book ai didi

spring - 如何使用 Hibernate 在 Spring MVC 中为读取操作应用事务最佳实践?

转载 作者:行者123 更新时间:2023-12-04 18:48:06 25 4
gpt4 key购买 nike

正如博客/书籍(例如 Mark Richards 的 Java 事务设计策略)中提到的那样,读取操作必须具有 Propagation.SUPPORTS 属性。

在使用 Hibernate 4.1 的简​​单 Spring 3.1 MVC 项目中,场景是:

  • 使用@Transactional
  • 的声明式事务管理
  • org.springframework.orm.hibernate4.LocalSessionFactoryBean 的 sessionFactory
  • org.springframework.orm.hibernate4.HibernateTransactionManager 的事务管理器
  • 带有 @Transactional(propagation=Propagation.REQUIRED) 的服务类
  • 该 Service 类的函数仅使用 @Transactional(propagation=Propagation.SUPPORTS) 检索结果集(执行读取操作)
  • 读取操作函数使用 sessionFactory.getCurrentSession().get()
  • 检索结果集

    当然,Controller在执行读操作的功能时,会因为事务没有启动,也没有获取到 session 而引发异常“No Session found for current thread”。

    基于上述配置(虽然它是最好的,例如非侵入性,更少的代码等),除非事务在 Propagation.REQUIRED 或 Propagation.REQUIRES_NEW 之前启动,否则不能使用 Propagation.SUPPORTS 属性。

    我们如何使用 Propagation.SUPPORTS 进行读取操作而无需启动事务,例如使用 Propagation.REQUIRED 但仍然利用声明式事务管理的好处?

    先感谢您。

    编码器,这里是配置:
    <tx:annotation-driven transaction-manager="txManager"/>

    <context:component-scan base-package="com.myapps.service.impl" />

    <bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
    <list>
    <value>.....</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">${db.dialect}</prop>
    <prop key="hibernate.format_sql">true</prop>
    </props>
    </property>
    </bean>

    最佳答案

    我不同意使用 SUPPORTS 进行读取操作。需要使用。

  • 无论如何都需要一个事务来执行每个数据库操作
  • 做几个小事务一次读取几个东西不会受益于一级缓存
  • 所有后续读取之间不会有任何隔离,这意味着第一次读取不可见的内容可能会在第二次读取时可见
  • 遍历关联时会出现延迟加载异常
  • 关于spring - 如何使用 Hibernate 在 Spring MVC 中为读取操作应用事务最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750445/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com