posts - 431,  comments - 344,  trackbacks - 0
          公告
           Don't Repeat Yourself
          座右銘:you can lose your money, you can spent all of it, and if you work hard you get it all back. But if you waste your time, you're never gonna get it back.
          公告本博客在此聲明部分文章為轉(zhuǎn)摘,只做資料收集使用。


          微信: szhourui
          QQ:109450684
          Email
          lsi.zhourui@gmail.com
          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          留言簿(15)

          隨筆分類(1019)

          文章分類(3)

          文章檔案(21)

          收藏夾

          Link

          好友博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 865421
          • 排名 - 44

          最新評論

          閱讀排行榜

          Spring2.0.1以后的版本已經(jīng)支持配置多數(shù)據(jù)源,并且可以在運行的時候動態(tài)加載不同的數(shù)據(jù)源。通過繼承AbstractRoutingDataSource就可以實現(xiàn)多數(shù)據(jù)源的動態(tài)轉(zhuǎn)換。目前做的項目就是需要訪問12個數(shù)據(jù)源,每個數(shù)據(jù)源的表結(jié)構(gòu)都是相同的,所以要求數(shù)據(jù)源的變動對于編碼人員來說是透明,也就是說同樣SQL語句在不同的環(huán)境下操作的數(shù)據(jù)庫是不一樣的。具體的配置如下:
          一、首先需要寫一個靜態(tài)的鍵值對照類:

          代碼
          1. package cn.com.xinli.ccp.dynamicds;   
          2.   
          3. public class DataSourceMap {   
          4.     public static final String Admin="Admin";   
          5.     public static final String Yxh = "Yxh";   
          6. }  

           

           

           

          這個類主要在使用的時候當作獲得數(shù)據(jù)源的標志使用。
          二、建立一個獲得和設(shè)置上下文的類:

          代碼
          1. package cn.com.xinli.ccp.dynamicds;   
          2.   
          3. public class CustomerContextHolder {   
          4.     private static final ThreadLocal contextHolder =    
          5.         new ThreadLocal();   
          6.        
          7.     public static void setCustomerType(String customerType) {   
          8.       contextHolder.set(customerType);   
          9.     }   
          10.        
          11.     public static String getCustomerType() {   
          12.       return (String) contextHolder.get();   
          13.     }   
          14.        
          15.     public static void clearCustomerType() {   
          16.       contextHolder.remove();   
          17.     }   
          18.   
          19. }  

          這個主要負責(zé)設(shè)置上下文環(huán)境和獲得上下文環(huán)境。
          三、建立動態(tài)數(shù)據(jù)源類,這個類必須繼承AbstractRoutingDataSource:
          代碼
          1. package cn.com.xinli.ccp.dynamicds;   
          2.   
          3. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;   
          4.   
          5. public class DynamicDataSource extends AbstractRoutingDataSource {   
          6.   
          7.     protected Object determineCurrentLookupKey() {   
          8.         // TODO Auto-generated method stub   
          9.         return CustomerContextHolder.getCustomerType();   
          10.     }   
          11.   
          12. }  

          這個類實現(xiàn)了determineCurrentLookupKey方法,該方法返回一個Object,一般是返回字符串,也可以是枚舉類型。該方法中直接使用了CustomerContextHolder.getCustomerType()方法獲得上下文環(huán)境并直接返回。
          四、編寫spring的配置文件配置數(shù)據(jù)源
          代碼
          1. <bean id="parentDataSource"  
          2.             class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
          3.             <property name="driverClassName">  
          4.                 <value>COM.ibm.db2.jdbc.net.DB2Driver</value>  
          5.             </property>  
          6.             <property name="url">  
          7.                 <value>jdbc:db2:127.0.0.1:TEST</value>  
          8.             </property>  
          9.     </bean>  
          10.        
          11.     <bean id="adminDataSource" parent="parentDataSource">  
          12.         <property name="username" value="admin"/>  
          13.         <property name="password" value="master997mb"/>  
          14.     </bean>  
          15.        
          16.     <bean id="yxhDataSource" parent="parentDataSource">  
          17.         <property name="username" value="yxh"/>  
          18.         <property name="password" value="yxh"/>  
          19.     </bean>  

          在這個配置中可以看到首先有個parentDataSource,這個主要配置一些數(shù)據(jù)源的公用信息,項目中都是鏈接DB2數(shù)據(jù)庫;adminDataSource和yxhDataSource是根據(jù)不同需要配置的個性化信息,但都必須加parent屬性,值為parentDataSource。這樣就配置好了2個數(shù)據(jù)源信息。當然如果鏈接的多數(shù)據(jù)源是不同類型的兩個數(shù)據(jù)庫,那么parentDataSource就可以不要了,直接配置兩個不同的數(shù)據(jù)源鏈接就可以了。
          五、編寫spring配置文件配置多數(shù)據(jù)源映射關(guān)系
          代碼
          1. <bean id="dataSource" class="cn.com.xinli.ccp.dynamicds.DynamicDataSource">  
          2.        <property name="targetDataSources">  
          3.           <map key-type="Java.lang.String">  
          4.              <entry key="Yxh" value-ref="yxhDataSource"/>  
          5.           </map>  
          6.        </property>  
          7.        <property name="defaultTargetDataSource" ref="adminDataSource"/>  
          8.     </bean>  

          在這個配置中第一個property屬性配置目標數(shù)據(jù)源,<map key-type="Java.lang.String">中的key-type必須要和靜態(tài)鍵值對照類DataSourceMap中的值的類型相同;<entry key="Yxh" value-ref="yxhDataSource"/>中key的值必須要和靜態(tài)鍵值對照類中的值相同,如果有多個值,可以配置多個<entry>標簽。第二個property屬性配置默認的數(shù)據(jù)源。
          六、配置hibernate。
          Hibernate的配置和普通的hibernate、spring結(jié)合的配置一樣
          代碼
          1. <bean id="sessionFactory"  
          2.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
          3.         <!-- to override, use the "SpringDatasourceConfig" snippet in your project -->  
          4.         <property name="dataSource">  
          5.             <ref local="dataSource" />  
          6.         </property>  
          7.         <property name="mappingResources">  
          8.             <list>  
          9.                 <value>  
          10.                     cn/com/xinli/ccp/entity/User.hbm.xml   
          11.                 </value>  
          12.                 <value>  
          13.                     cn/com/xinli/ccp/entity/Test.hbm.xml   
          14.                 </value>  
          15.             </list>  
          16.         </property>  
          17.         <property name="hibernateProperties">  
          18.             <props>  
          19.                 <prop key="hibernate.dialect">  
          20.                     org.hibernate.dialect.DB2Dialect   
          21.                 </prop>  
          22.                    
          23.                 <prop key="hibernate.show_sql">true</prop>  
          24.                 <prop key="hibernate.use_outer_join">true</prop>  
          25.                 <prop key="hibernate.jdbc.batch_size">50</prop>  
          26.                 <prop key="hibernate.jdbc.fetch_size">5</prop>  
          27.                 <prop key="hibernate.connection.pool_size">2</prop>  
          28.                 <prop key="hibernate.connection.autocommit">false</prop>  
          29.                 <prop key="hibernate.cache.use_query_cache">false</prop>  
          30.                 <prop key="hibernate.max_fetch_depth">1</prop>  
          31.                 <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>  
          32.             </props>  
          33.         </property>  
          34.     </bean>  
          35.   
          36. <bean id="mydao" class="cn.com.xinli.ccp.dao.HibernateBaseDao">  
          37.         <property name="sessionFactory">  
          38.             <ref local="sessionFactory" />  
          39.         </property>  
          40.     </bean>  

          關(guān)于dao的代碼這里就省略了。
          七、配置結(jié)束,可以使用了。
          代碼
          1. public class DaoTest extends TestCase {   
          2.   
          3.     public void testSave() throws Exception{   
          4.         CustomerContextHolder.setCustomerType(DataSourceMap.Admin);//設(shè)置數(shù)據(jù)源   
          5.         //hibernate創(chuàng)建實體   
          6.         Test test = new Test();   
          7.         test.setTest("22222222");   
          8.            
          9.         mydao.save(test);//使用dao保存實體   
          10.            
          11.         CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);//設(shè)置為另一個數(shù)據(jù)源   
          12.            
          13.         mydao.save(test);//使用dao保存實體到另一個庫中   
          14.            
          15.     }   
          16. }  
          在項目中對于編碼人員對多數(shù)據(jù)源的切換可以做成透明的,操作同樣的dao,就可以訪問不同的數(shù)據(jù)庫了。
          posted on 2009-03-09 21:06 周銳 閱讀(1914) 評論(0)  編輯  收藏 所屬分類: HibernateSpring
          主站蜘蛛池模板: 盈江县| 高安市| 唐河县| 盘锦市| 郯城县| 循化| 伊宁县| 宾阳县| 东城区| 四平市| 遂川县| 犍为县| 台中市| 宁晋县| 柏乡县| 吐鲁番市| 通河县| 长乐市| 盖州市| 翁牛特旗| 德安县| 清水河县| 文安县| 丹巴县| 黄冈市| 务川| 弥勒县| 亳州市| 井陉县| 达孜县| 福鼎市| 延长县| 都昌县| 平武县| 巨鹿县| 辽阳市| 临安市| 永新县| 平果县| 会理县| 隆德县|