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

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

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

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

    容器管理的分布式事務(wù)

    分布式事務(wù)分類:


    一個App對應(yīng)若干DB


    一個App對應(yīng)1個DB,但兩個app之間有事務(wù)

    我們將第一幅圖描述的情況姑且叫做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(容其中定義的),由于對應(yīng)多個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就可以使用了,而關(guān)鍵點是調(diào)用myService的EJB的方法必須要有事務(wù)定義.如:

    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調(diào)用.

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

    EJB_A.method(){

    pojo.method();

    EJB_B.method();

    }

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

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

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

    在使用容器管理的事務(wù)的時候,hibernate的 lazy問題必須解決,解決方法:采用攔截器,在方法開始之前打開session,之后關(guān)閉,詳見另一片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 閱讀(786) 評論(0)  編輯  收藏 所屬分類: HibernateSpring<項目>數(shù)據(jù)庫設(shè)計

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

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    IT風云人物

    文檔

    朋友

    相冊

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

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲卡一卡二卡乱码新区| 久久久久久亚洲精品| 国产成人精品日本亚洲专区6| 久久免费福利视频| 亚洲精品美女久久777777| 成人自慰女黄网站免费大全| 中文字幕亚洲激情| 久久国产美女免费观看精品 | 婷婷亚洲综合五月天小说在线| 操美女视频免费网站| 亚洲日产乱码一二三区别 | 亚洲精品久久久www| 一级毛片大全免费播放下载| 红杏亚洲影院一区二区三区| 中文在线观看免费网站| 亚洲热线99精品视频| 久久成人a毛片免费观看网站| 亚洲美女大bbbbbbbbb| 免费精品国产自产拍在线观看图片| 亚洲免费视频播放| 日本特黄a级高清免费大片| 国产午夜亚洲精品不卡电影| 国产AⅤ无码专区亚洲AV| 免费观看久久精彩视频| 精品无码一区二区三区亚洲桃色| 又粗又大又黑又长的免费视频| 亚洲综合一区国产精品| 四虎影视永久免费观看地址| aa在线免费观看| 亚洲视频小说图片| 日韩成人免费视频播放| 久久精品无码免费不卡| 亚洲免费闲人蜜桃| 亚洲精品成人在线| 亚洲视频免费在线看| 国产AV无码专区亚洲AV蜜芽| 亚洲码国产精品高潮在线| 18禁止观看免费私人影院| 黄色网址在线免费观看| 亚洲国产第一页www| 在线日韩av永久免费观看|