首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SSH 整合實戰:Spring 聲明式事務管理配置全解析

     編輯:Java 相關知識

配置文件完整版(含詳細註釋)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:aop="https://www.springframework.org/schema/aop"
    xmlns:tx="https://www.springframework.org/schema/tx"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        https://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
        https://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- ========== 1. 數據源配置 ========== -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="url" value="${jdbc.url}"/>
        <!-- 生產環境建議添加連接池參數 -->
        <!-- <property name="initialSize" value="5"/> -->
        <!-- <property name="maxActive" value="20"/> -->
    </bean>

    <!-- ========== 2. SessionFactory 配置 ========== -->
    <bean id="localSessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <array>
                <value>www/csdn/spring/demo/domain/Admins.hbm.xml</value>
                <value>www/csdn/spring/demo/domain/Atusers.hbm.xml</value>
                <!-- 更多映射文件 -->
            </array>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
            </props>
        </property>
    </bean>

    <!-- ========== 3. HibernateTemplate 封裝 ========== -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="localSessionFactoryBean"/>
    </bean>

    <!-- ========== 4. HibernateDaoSupport 抽象基類 ========== -->
    <bean id="hibernateDaoSupport" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport" abstract="true">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>

    <!-- ========== 5. 事務管理器 ========== -->
    <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="localSessionFactoryBean"/>
    </bean>

    <!-- ========== 6. 事務屬性定義(通知) ========== -->
    <tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">
        <tx:attributes>
            <!-- 寫操作: REQUIRED 傳播,默認隔離級別 -->
            <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
            <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT"/>
            <!-- 讀操作:唯讀優化 -->
            <tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
            <tx:method name="find*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
            <tx:method name="list*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!-- ========== 7. AOP 切面織入 ========== -->
    <aop:config>
        <!-- 切點:service 包下所有類的所有方法 -->
        <aop:pointcut expression="execution(* *..service.*.*(..))" id="mycut"/>
        <!-- 通知器:將事務通知應用到切點 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="mycut"/>
    </aop:config>

</beans>

核心模塊深度解析

1. 數據源與屬性佔位符

  • 使用 ${jdbc.xxx} 從 jdbc.properties 讀取配置,實現環境隔離
  • 生產環境必須配置連接池參數(initialSize、maxActive、maxWait 等)

2. LocalSessionFactoryBean 關鍵屬性

屬性作用
dataSource注入數據源,Hibernate 通過它獲取連接
mappingResources載入 .hbm.xml 映射文件,支援數組批量配置
hibernateProperties配置 Hibernate 核心參數:方言、SQL 顯示、查詢工廠等

3. 事務通知(tx:advice)方法匹配規則

  • name="save*":匹配以 save 開頭的所有方法(saveUser、saveOrUpdate 等)
  • propagation="REQUIRED":最常用傳播行為,有事務則加入,無則新建
  • isolation="DEFAULT":使用數據庫默認隔離級別(通常為 READ_COMMITTED)
  • read-only="true":查詢方法必須標記,允許數據庫優化(如 MySQL 忽略鎖、Hibernate 跳過快照)

4. AOP 切點表達式設計

execution(* *..service.*.*(..))
  • *:返回類型任意
  • *..service:任意包層級下的 service 包
  • *.*:任意類的任意方法
  • (..):任意參數

建議:切點盡量精確到業務層(service),避免織入 DAO 或 Controller 層。


進階優化方向

  1. 註解驅動事務:<tx:annotation-driven/> + @Transactional,更靈活、代碼可讀性更強
  2. 多事務管理器區分:不同數據源配置多個 PlatformTransactionManager,@Transactional("txManager2") 指定
  3. 異常回滾策略細粒度控制:rollback-for="MyBusinessException"、no-rollback-for="ValidationException"
  4. 事務超時設置:timeout="30"(秒),防止長事務佔用連接

常見問題排查

現象可能原因排查方向
事務不生效(數據未提交/回滾)切點表達式未匹配到目標方法檢查 package 結構、方法名、execution 表達式
事務管理器 Bean 創建失敗SessionFactory 未正確注入檢查 localSessionFactoryBean 依賴鏈
唯讀事務報錯數據庫/驅動不支援唯讀優化移除 read-only="true" 或升級驅動
懶加載異常Session 關閉後訪問關聯集合Open Session In View Filter / DTO 轉換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved