<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    OMG,到底在尋找什么..................
    (構造一個完美的J2EE系統(tǒng)所需要的完整知識體系)
    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數(shù)據(jù)源的sessionFactory,oracle數(shù)據(jù)源的類似

    <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"優(yōu)雅解決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 閱讀(779) 評論(0)  編輯  收藏 所屬分類: HibernateSpring<項目>數(shù)據(jù)庫設計

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

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    IT風云人物

    文檔

    朋友

    相冊

    經(jīng)典網(wǎng)站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级毛片免费毛片一级毛片免费 | 黄网站色在线视频免费观看| 久久久久亚洲精品日久生情| 久久精品无码一区二区三区免费| 国产综合成人亚洲区| 亚洲国产精品无码成人片久久| 日韩在线播放全免费| 免费国产在线精品一区| 久久精品亚洲一区二区 | 日韩精品免费电影| 岛国岛国免费V片在线观看| 亚洲国产人成在线观看| 国产亚洲美女精品久久久| 久久久精品2019免费观看| 国产精品亚洲二区在线| 亚洲人成在线影院| 亚洲av日韩av欧v在线天堂| 精品无码国产污污污免费网站| 青青视频免费在线| 亚洲图片激情小说| 久久精品亚洲福利| 午夜dj在线观看免费视频| 久久午夜羞羞影院免费观看| 男性gay黄免费网站| 亚洲午夜电影在线观看高清| 精品国产亚洲男女在线线电影| 91视频国产免费| 久久青草免费91线频观看不卡| 美女尿口扒开图片免费| 亚洲第一页在线视频| 中文字幕亚洲综合久久菠萝蜜| 女人18毛片水最多免费观看| 日韩精品在线免费观看| 一级毛片高清免费播放| 亚洲欧美精品午睡沙发| 亚洲精品美女视频| 久久久综合亚洲色一区二区三区 | 亚洲va国产va天堂va久久| 亚洲福利在线播放| 国产国产人免费视频成69大陆| 国产成人无码免费看视频软件|