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

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

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

    京山游俠

    專注技術(shù),拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    為了提高網(wǎng)站將來向外擴(kuò)展的能力,我是用了數(shù)據(jù)分割的架構(gòu),這就要求我的網(wǎng)站能夠靈活的訪問多個數(shù)據(jù)庫,如果是直接操作JDBC,這根本就不成問題。但是在SpringSide2.0中,由于集成了Hibernate,所以對數(shù)據(jù)的訪問大部分時候都是通過配置實(shí)現(xiàn)的。

    要想在SpringSide2.0中使用多個數(shù)據(jù)庫,最簡單的辦法就是配置多個sessionFactory,下面是我的探索步驟。

    首先,要修改src/resources/config目錄下的jdbc.properties文件,定義多個數(shù)據(jù)庫的連接,如下:
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.urlYumDaysIndex
    =jdbc:mysql://localhost:3306/YumDaysIndex?useUnicode=true&characterEncoding=utf8
    jdbc.urlYumDays001
    =jdbc:mysql://localhost:3306/YumDays001?useUnicode=true&characterEncoding=utf8

    然后,修改src/resources/spring目錄下的dataAccessContext-hibernate.xml文件,定義多個數(shù)據(jù)源,它們之間只有url屬性不同:
    ????<!--?數(shù)據(jù)源定義,使用Apache?DBCP?連接池?-->
    ????
    <bean?id="dataSourceYumDaysIndex"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
    ????????
    <property?name="driverClassName"?value="${jdbc.driverClassName}"/>
    ????????
    <property?name="url"?value="${jdbc.urlYumDaysIndex}"/>
    ????????
    <property?name="username"?value="${jdbc.username}"/>
    ????????
    <property?name="password"?value="${jdbc.password}"/>
    ????
    </bean>
    ????
    ????
    <!--?數(shù)據(jù)源定義,使用Apache?DBCP?連接池?-->
    ????
    <bean?id="dataSourceYumDays001"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
    ????????
    <property?name="driverClassName"?value="${jdbc.driverClassName}"/>
    ????????
    <property?name="url"?value="${jdbc.urlYumDays001}"/>
    ????????
    <property?name="username"?value="${jdbc.username}"/>
    ????????
    <property?name="password"?value="${jdbc.password}"/>
    ????
    </bean>

    然后,還是修改這個文件,定義多個sessionFactory,它們之間只有數(shù)據(jù)源的屬性不同:
    ????<!--Hibernate?SessionFatory-->
    ????
    <bean?id="sessionFactoryIndex"?class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    ????????
    <property?name="dataSource"?ref="dataSourceYumDaysIndex"/>
    ????????
    <property?name="annotatedClasses">
    ????????????
    <list>
    ????????????????
    <value>com.yumdays.model.Catalog</value>
    ????????????????
    <value>com.yumdays.model.Statistic</value>
    ????????????
    </list>
    ????????
    </property>
    ????????
    <property?name="hibernateProperties">
    ????????????
    <props>
    ??????????????
    <!--?see?/components/orm/hibernate/meta/dialect.properties?for?all?Dialect?-->
    ????????????????
    <prop?key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
    ????????????????
    <prop?key="hibernate.show_sql">true</prop>
    ????????????????
    <prop?key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
    ????????????????
    <prop?key="hibernate.cache.use_query_cache">true</prop>
    ????????????
    </props>
    ????????
    </property>
    ????
    </bean>
    ????
    ????
    <!--Hibernate?SessionFatory-->
    ????
    <bean?id="sessionFactory001"?class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    ????????
    <property?name="dataSource"?ref="dataSourceYumDays001"/>
    ????????
    <property?name="annotatedClasses">
    ????????????
    <list>
    ????????????
    </list>
    ????????
    </property>
    ????????
    <property?name="hibernateProperties">
    ????????????
    <props>
    ??????????????
    <!--?see?/components/orm/hibernate/meta/dialect.properties?for?all?Dialect?-->
    ????????????????
    <prop?key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
    ????????????????
    <prop?key="hibernate.show_sql">true</prop>
    ????????????????
    <prop?key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
    ????????????????
    <prop?key="hibernate.cache.use_query_cache">true</prop>
    ????????????
    </props>
    ????????
    </property>
    ????
    </bean>

    再然后,還是修改這個文件,定義多個不同的事務(wù)管理器,它們之間只有sessionFactory屬性不同,如下:
    ????<!--Hibernate?TransactionManager-->
    ????
    <bean?id="transactionManagerIndex"?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    ????????
    <property?name="sessionFactory"?ref="sessionFactoryIndex"/>
    ????
    </bean>
    ????
    <bean?id="transactionManager001"?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    ????????
    <property?name="sessionFactory"?ref="sessionFactory001"/>
    ????
    </bean>

    以上的這些修改是最基本的,就是把sessionFactory和事務(wù)管理器都定義為多份的,以后,在要使用到這些東西的時候,就不能使用Spring提供的自動按照name匹配的方便了,必須得自己指定。
    利用SpringSide2.0,只需要編寫表示Model的POJO,就可以很容易得到數(shù)據(jù)訪問層的代碼,比如,我的網(wǎng)站有一個表示文章分類的數(shù)據(jù)表,其對應(yīng)的Model如下:
    package?com.yumdays.model;

    import?java.io.Serializable;

    import?javax.persistence.Entity;
    import?javax.persistence.Id;
    import?javax.persistence.Table;
    import?org.hibernate.annotations.GenericGenerator;

    @Entity
    @Table(name
    ="catalogs")
    public?class?Catalog?implements?Serializable?{
    ????
    private?String?id;
    ????
    private?String?name;
    ????
    ????@Id
    ????@GenericGenerator(name
    ="system-uuid",strategy="uuid")
    ????
    public?String?getId()?{
    ????????
    return?id;
    ????}
    ????
    public?void?setId(String?id)?{
    ????????
    this.id?=?id;
    ????}
    ????
    public?String?getName()?{
    ????????
    return?name;
    ????}
    ????
    public?void?setName(String?name)?{
    ????????
    this.name?=?name;
    ????}
    }

    那么,其DAO層的代碼如下:
    package?com.yumdays.service;

    import?org.springside.core.dao.HibernateEntityDao;
    import?com.yumdays.model.Catalog;

    public?class?CatalogManager?extends?HibernateEntityDao<Catalog>?{

    }

    相當(dāng)?shù)暮啙?,該CatalogManager類提供了非常完整的find、get、save等功能。下一步,將這個類是用Spring管理起來的時候,就必須自己指定sessionFactory了,因此,在src/resources/spring/目錄下的serviceContext.xml文件中,配置的形式如下:
    <?xml?version="1.0"?encoding="UTF-8"?>
    <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN?2.0//EN"?"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans?default-lazy-init="true"?default-autowire="byName">
    ???????????
    <bean?id="catalogManager"?class="com.yumdays.service.CatalogManager">
    ???????????????????
    <property?name="sessionFactory"?ref="sessionFactoryIndex"/>
    ???????????
    </bean>
    ???????????
    <bean?id="statisticManager"?class="com.yumdays.service.StatisticManager">
    ???????????????????
    <property?name="sessionFactory"?ref="sessionFactoryIndex"/>
    ???????????
    </bean>
    </beans>

    至于事務(wù)管理器,是在配置事務(wù)的時候用到的,因此,修改src/resources/spring目錄下的applicationContext.xml文件,如下:
    ????<!--?以AspectJ方式?定義?AOP?-->
    ????
    <aop:config?proxy-target-class="true">
    ????????
    <!--?注意,請把第2個*號換為項(xiàng)目package?-->
    ????????
    <aop:advisor?pointcut="execution(*?*..service.CatalogManager.*(..))"?advice-ref="txAdviceIndex"/>
    ????????
    <aop:advisor?pointcut="execution(*?*..service.StatisticManager.*(..))"?advice-ref="txAdviceIndex"/>
    ????
    </aop:config>

    ????
    <!--?基本事務(wù)定義,使用transactionManager作事務(wù)管理,默認(rèn)get*方法的事務(wù)為readonly,其余方法按默認(rèn)設(shè)置.
    ?????????????默認(rèn)的設(shè)置請參考Spring文檔事務(wù)一章.?
    -->
    ????
    <tx:advice?id="txAdviceIndex"?transaction-manager="transactionManagerIndex">
    ????????
    <tx:attributes>
    ????????????
    <tx:method?name="get*"?read-only="true"/>
    ????????????
    <tx:method?name="find*"?read-only="true"/>
    ????????????
    <tx:method?name="*"/>
    ????????
    </tx:attributes>
    ????
    </tx:advice>

    OK,快速啟動項(xiàng)目,但是還是沒有成功,報(bào)出的錯誤提示說沒有定義name為transactionManager的bean。經(jīng)過我這么一改,當(dāng)然沒有定義這個bean了,但是我也沒有用它???我用的是transactionManagerIndex,經(jīng)過多次排查,我仍然沒有找出問題的癥結(jié)所在。

    此外,在web.xml文件中配置的org.springframework.orm.hibernate3.support.OpenSessionInViewFilter也起不到作用了,因?yàn)槲也恢肋@個類能不能管理多個SessionFactory,似乎是不行的。

    由此可見,使用默認(rèn)值的地方太多了,也是會害死人的。我已經(jīng)向SpringSide的老大江南白衣請教這個問題了,暫時還沒有得到回復(fù)。

    為了使我的項(xiàng)目能夠順利繼續(xù),我只有采取另外的變通方法,那就是把YumDaysIndex和YumDaysContent作為兩個不同的項(xiàng)目分別開發(fā)。但是這樣并不能夠一勞永逸,將來當(dāng)數(shù)據(jù)庫的負(fù)載達(dá)到極限,需要讓主從數(shù)據(jù)庫服務(wù)器分開,主服務(wù)器只提供寫操作,從服務(wù)器只提供讀操作,我還得把寫數(shù)據(jù)庫和讀數(shù)據(jù)庫的代碼分到不同的項(xiàng)目中進(jìn)行開發(fā)。

    評論

    # re: 在SpringSide2.0中使用多個數(shù)據(jù)庫  回復(fù)  更多評論   

    2008-02-02 09:18 by 456
    多個數(shù)據(jù)庫之間的事務(wù)你怎么處理?
    使用JTA是一個比較好的解決方法。

    # re: 在SpringSide2.0中使用多個數(shù)據(jù)庫  回復(fù)  更多評論   

    2008-02-02 19:30 by 海邊沫沫
    JTA往往都是由商業(yè)的中間件廠商提供,價(jià)格很貴的。而且不同廠商提供的實(shí)現(xiàn)不一樣,要根據(jù)使用什么樣的中間件來配置,不具備通用性。

    在一個使用WebLogic 7.0、8.1或更高版本的環(huán)境中,一般會優(yōu)先選用特定于WebLogic的 WebLogicJtaTransactionManager 類來取代基礎(chǔ)的 JtaTransactionManager 類。在WebLogic環(huán)境中,該類提供了對Spring事務(wù)定義的完全支持,超過了標(biāo)準(zhǔn)的JTA語義。它的特性包括:支持事務(wù)名,支持為每個事務(wù)定義隔離級別,以及在任何環(huán)境下正確地恢復(fù)事務(wù)的能力。

    在WebSphere 5.1、5.0和4環(huán)境下,可以使用Spring的 WebSphereTransactionManagerFactoryBean 類。這是一個工廠類,通過WebSphere的 靜態(tài) 訪問方法獲取到JTA TransactionManager 實(shí)例。(這些靜態(tài)方法在每個版本的WebSphere中都不同。)一旦通過工廠bean獲取到JTA TransactionManager 實(shí)例,就可以使用該實(shí)例裝配一個Spring的 JtaTransactionManager bean,它封裝了JTA UserTransaction,提供增強(qiáng)的事務(wù)語義。

    # re: 在SpringSide2.0中使用多個數(shù)據(jù)庫  回復(fù)  更多評論   

    2008-02-17 12:43 by 93ttq
    非常 不錯的好

    # re: 在SpringSide2.0中使用多個數(shù)據(jù)庫  回復(fù)  更多評論   

    2008-02-21 11:16 by zhangv
    那就手動把你的trasactionmanager注入到相應(yīng)的sessionfactory
    主站蜘蛛池模板: 亚洲视频在线免费| 免费播放特黄特色毛片| 国产日韩久久免费影院| 国产成人精品日本亚洲专区6| 久久亚洲精品无码播放| 欧洲美熟女乱又伦免费视频| 最近2019免费中文字幕视频三| 羞羞视频免费网站日本| 亚洲熟妇AV日韩熟妇在线| 亚洲喷奶水中文字幕电影| 亚洲AV无码一区东京热| 亚洲无码高清在线观看| 国产免费观看青青草原网站| 国产精彩免费视频| 久久伊人免费视频| 羞羞视频免费网站在线看| 美女黄频a美女大全免费皮| 亚洲综合久久精品无码色欲| 亚洲婷婷综合色高清在线| 亚洲成A人片777777| 亚洲小说区图片区另类春色| 日韩精品成人亚洲专区| 国产老女人精品免费视频| 国内自产少妇自拍区免费| 毛片高清视频在线看免费观看| 亚洲免费人成视频观看| 综合在线免费视频| 免费人成在线观看69式小视频| 99国产精品视频免费观看| 99久久99久久免费精品小说| 9277手机在线视频观看免费| 免费精品一区二区三区第35| 玖玖在线免费视频| 久久久免费的精品| 精品免费人成视频app| 中文免费观看视频网站| 91麻豆最新在线人成免费观看 | 亚洲日韩在线中文字幕第一页| 国产一级一片免费播放| 日韩一级在线播放免费观看| 在线观看91精品国产不卡免费|