spring在專案中實際用途

落葉翩翩發表於2012-12-05

1、資料庫連線池的託管、自動事務管理(不用在手動關閉session,和開啟事務、持久化操作、提交事務)

2、aop的事務代理


spring管理事務一共有兩種方式:

1、

            <!-- 配置session工廠 -->
            <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                <property name="configLocation">
                    <value>classpath:Hibernate.cfg.xml</value>
                </property>
            </bean>
            <!-- 配置hibernateTemplate -->
            <bean name="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
                <!-- 讀取sessionFactory -->
                <property name="sessionFactory" ref="sessionFactory"></property>
            </bean>
            <!-- 宣告事務 -->
            <bean name="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <!-- 讀取sessionFactory -->
                <property name="sessionFactory" ref="sessionFactory"></property>
            </bean>
            <!-- 開啟註解事務 -->
            <tx:advice id="txAdvice" transaction-manager="txManager">
                <tx:attributes>
                    <tx:method name="*"/>
                    <tx:method name="query*" read-only="true"/>
                </tx:attributes>
            </bean>

             <!--註解可以被繼承,可以新增到介面上

           

                      如果不配置<tx:advice transaction-manager="txManager"><!-- 通知註解事務管理-->

                                           <tx:attributes>
                                                 <tx:method name="*"/>
                                                  <tx:method name="query*" read-only="true"/>
                                         </tx:attributes>

                       則上圖中@Transactional註解也不會起作用

              -->

2、為單個bean配置事務(aop事務代理進行自動事務管理,自動資料庫連線關閉)

              <!-- 配置一個業務邏輯Bean -->
             <bean id="test" class="com.spring.tranProxy.PersonDaoImpl">
                     <property name="ds" ref="dataSource" />
             </bean>
    
              <!-- 為業務邏輯Bean配置事務代理 -->
               <bean id="testTrans"
                           class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                            <!-- 為事務代理工廠Bean注入事務管理器 -->
                                    <property name="transactionManager" ref="transactionManager" />
                                   <property name="target" ref="test" />
                                  <!-- 指定事務屬性 -->
                            <property name="transactionAttributes">
                                   <props>
                                          <prop key="*">readOnly</prop>
                              </props>
                    </property>
           </bean>


spring對資料庫session的管理

              

觀點:

1.使用getSession()返回session有兩種情況。
   a.當前執行緒有存在session,就直接返回。
   b.當前執行緒中不存在session就重新建立一個。

如果spring配置了事務,那麼session就不必關閉,在事務完成之後將被自動關閉。如果沒有參與事務那就要呼叫session.close()關閉。

2.getSession()拿到的Session無論是否參與事務,Spring都不負責關閉,除非使用OpenSessionInView模式。


               

相關文章