OMG,到底在尋找什么..................
          (構造一個完美的J2EE系統所需要的完整知識體系)
          posts - 198,  comments - 37,  trackbacks - 0

          容器管理的分布式事務

          分布式事務分類:


          一個App對應若干DB


          一個App對應1個DB,但兩個app之間有事務

          我們將第一幅圖描述的情況姑且叫做1app2db,第二副圖的情況叫做2app2db(這些僅僅是一個名稱而已,不要誤解)

          我們下來分別描述一下每一種情況.

          1app2db:

          <jee:jndi-lookup id="dataSource_jndi_mysql" jndi-name="jdbc/mysql" cache="true" />
          <jee:jndi-lookup id="dataSource_jndi_oracle" jndi-name="jdbc/oracle" cache="true" />

          獲取datasource(容其中定義的),由于對應多個db,故存在多個sessionFactory,多個datasource,etc.下面僅對一個進行描述,其余的配置是類似的.

          <bean id="sessionFactory_mysql"
          class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          <property name="dataSource">
          <ref local="dataSource_jndi_mysql" />
          </property>
          .......下略

          定義mysql數據源的sessionFactory,oracle數據源的類似

          <bean id="testDao" class="com.company.jncz.dao.HibernateBaseDao">
          <property name="sessionFactory">
          <ref local="sessionFactory_mysql" />
          </property>
          </bean>
          <bean id="myService" class="com.company.jncz.MyService">
          <property name="dao">
          <ref local="testDao" />
          </property>
          </bean>

          定義dao和service,oracle的類似

          這樣myService就可以使用了,而關鍵點是調用myService的EJB的方法必須要有事務定義.如:

          public double businessAdd(String value) throws EJBException {
          service.modifyUserName("4",value);//db1

          service2.modifyUserName("4",value);//db2
          return 2.0;
          }

          businessAdd方法必須要被定義在ejb-jar.xml中,否則會報錯,如下

          java.sql.SQLException: SQL operations are not allowed with no global transaction by default for XA drivers. If the XA driver suppo
          rts performing SQL operations with no global transaction, explicitly allow it by setting "SupportsLocalTransaction" JDBC connectio
          n pool property to true. In this case, also remember to complete the local transaction before using the connection again for globa
          l transaction, else a XAER_OUTSIDE XAException may result. To complete a local transaction, you can either set auto commit to true
          or call Connection.commit() or Connection.rollback().

          ? 2app2db:

          這種情況下呢,每一個app負責一個或若干個DB,而兩個app之間有ejb調用.

          關于dao,service的配置與上面相同,而ejb之間的調用,方法必須在ejb-jar.xml中定義事務,這樣容器就能保證事務正確的傳播和操作,比如一個ejb調用如下:

          EJB_A.method(){

          pojo.method();

          EJB_B.method();

          }

          EJB_A.method()方法只要拋出異常,則事務會傳播到EJB_B中,同樣引起EJB_B回滾.

          在做這個試驗的時候,我采用的是一個weblogic跑兩個domain的方法,遇到了一個問題,兩個domain之間的ejb調用不能直接進行,必須要在域之間建立"信任"關系,具體做法如下:

          mydomain->security->advanced->將"Enable Generated Credential"的勾去掉,同時在下面的框中輸入密碼,然后在另一個域中做同樣的操作,注意兩個域的密碼要相同.另外域的信任關系是可以傳播的,比如A信任b,c,那么b,c互相信任.

          在使用容器管理的事務的時候,hibernate的 lazy問題必須解決,解決方法:采用攔截器,在方法開始之前打開session,之后關閉,詳見另一片blog"優雅解決hibernate lazy問題".

          ______________________________________________________________________________________

          其中配置的部分代碼為:
          <bean id="dataSource_jndi_mysql"
          ??class="org.springframework.jndi.JndiObjectFactoryBean">
          ??<property name="jndiName" value="jdbc/mysql" />
          ?</bean>

          ?<!-- Hibernate SessionFactory -->
          ?<bean id="sessionFactory_mysql"
          ??class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          ??<property name="dataSource">
          ???<ref local="dataSource_jndi_mysql" />
          ??</property>
          ??<property name="mappingLocations">
          ???<list>
          ????<value>
          ?????classpath:/com/company/jncz/entity/User.hbm.xml
          ????</value>
          ????</value>
          ???</list>
          ??</property>
          ??<property name="hibernateProperties">
          ???<props>
          ????<prop key="hibernate.dialect">
          ?????org.hibernate.dialect.MySQLDialect
          ????</prop>
          ????<prop key="hibernate.show_sql">true</prop>
          ????<prop key="hibernate.use_outer_join">true</prop>
          ????<prop key="hibernate.jdbc.batch_size">50</prop>
          ????<prop key="hibernate.connection.pool_size">2</prop>
          ????<prop key="hibernate.cache.use_query_cache">true</prop>
          ????<prop key="hibernate.max_fetch_depth">1</prop>
          ????<prop key="hibernate.query.factory_class">
          ?????org.hibernate.hql.classic.ClassicQueryTranslatorFactory
          ????</prop>
          ???</props>
          ??</property>
          ?</bean>

          ?<bean id="testDao" class="com.company.jncz.dao.HibernateBaseDao">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory_mysql" />
          ??</property>
          ?</bean>
          ?<bean id="myService" class="com.company.jncz.MyService">
          ??<property name="dao">
          ???<ref local="testDao" />
          ??</property>
          ?</bean>

          ?<!-- jta start -->
          ?<bean id="jndiTemplate"
          ??class="org.springframework.jndi.JndiTemplate" singleton="true"
          ??lazy-init="default" autowire="default" dependency-check="default">
          ??<property name="environment">
          ???<props>
          ????<prop key="java.naming.factory.initial">
          ?????weblogic.jndi.WLInitialContextFactory
          ????</prop>
          ????<prop key="java.naming.provider.url">
          ?????t3://127.0.0.1:7001
          ????</prop>
          ???</props>
          ??</property>
          ?</bean>

          ?<bean id="transactionManager"
          ??class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
          ??<property name="jndiTemplate">
          ???<ref local="jndiTemplate" />
          ??</property>
          ??<property name="userTransactionName">
          ???<value>weblogic/transaction/UserTransaction</value>
          ??</property>
          ??<property name="transactionManagerName">
          ???<value>javax.transaction.TransactionManager</value>
          ??</property>
          ?</bean>

          ?<bean id="txProxyTemplate" abstract="true" lazy-init="true"
          ??class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          ??<property name="transactionManager">
          ???<ref bean="transactionManager" />
          ??</property>
          ??<property name="transactionAttributes">
          ???<props>
          ????<prop key="business*">
          ?????PROPAGATION_REQUIRED,-TestException
          ????</prop>
          ????<prop key="*">PROPAGATION_REQUIRED</prop>
          ???</props>
          ??</property>
          ?</bean>
          ?
          ?<bean id="serviceManage" parent="txProxyTemplate">
          ??<property name="target">
          ???<ref local="myService" />
          ??</property>
          ?</bean>
          </beans>

          原貼地址:http://oocl.spaces.live.com/?_c11_blogpart_blogpart=blogview&_c=blogpart&partqs=amonth%3d8%26ayear%3d2006

          posted on 2006-09-20 11:06 OMG 閱讀(781) 評論(0)  編輯  收藏 所屬分類: HibernateSpring<項目>數據庫設計

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風云人物

          文檔

          朋友

          相冊

          經典網站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥滨县| 兰溪市| 瓮安县| 汉川市| 西安市| 东乡族自治县| 班戈县| 乡城县| 黔西县| 丰都县| 辉县市| 遵化市| 旬邑县| 大埔县| 无棣县| 九台市| 临沧市| 柘荣县| 山阳县| 鄄城县| 博客| 集贤县| 平乐县| 大理市| 北安市| 连平县| 太原市| 馆陶县| 湖北省| 岑巩县| 河间市| 应用必备| 高密市| 子长县| 易门县| 凤翔县| 五华县| 福州市| 杭锦后旗| 保德县| 朝阳县|