欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

使用Spring如何實現(xiàn)配置多個數(shù)據(jù)源

使用Spring如何實現(xiàn)配置多個數(shù)據(jù)源?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)客戶idc服務中心,提供資陽服務器托管、成都服務器、成都主機托管、成都雙線服務器等業(yè)務的一站式服務。通過各地的服務中心,我們向成都用戶提供優(yōu)質廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務,資深網(wǎng)絡工程師在機房提供7*24小時標準級技術保障。

1.配置兩個不同的數(shù)據(jù)源,如下(由于項目使用的是druid數(shù)據(jù)庫連接,配置可以會復雜點比較):

<!-- 數(shù)據(jù)源配置1 --> 
  <bean id="testDataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
   <property name="driverClassName" value="${db.driver}" /> 
    <property name="url" value="${unity.db.jdbc.url}" />  
   <property name="username" value="${db.login.name}"></property> 
   <property name="password" value="${db.login.password}" /> 
   <property name="filters" value="${db.filters}"></property> 
   <property name="maxActive" value="${db.pool.maxActive}"></property> 
   <property name="initialSize" value="${db.pool.initialSize}"></property> 
   <property name="minIdle" value="${db.pool.minIdle}"></property> 
   <property name="maxWait" value="${db.maxWait}"></property>   
   <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"></property> 
   <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"></property> 
   <property name="validationQuery" value="${db.validationQuery}"></property> 
   <property name="testWhileIdle" value="${db.testWhileIdle}"></property> 
   <property name="testOnBorrow" value="${db.testOnBorrow}"></property> 
   <property name="testOnReturn" value="${db.testOnReturn}"></property> 
   <property name="poolPreparedStatements" value="${db.poolPreparedStatements}"></property> 
   <property name="maxOpenPreparedStatements" value="${db.maxOpenPreparedStatements}"></property> 
   <!-- 監(jiān)控數(shù)據(jù)庫 --> 
    <property name="proxyFilters"> 
      <list> 
        <ref bean="log-filter" /> 
      </list>  
    </property> 
    
 </bean> 
<!-- 數(shù)據(jù)源配置2 --> 
 <bean id="testDataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
  <property name="driverClassName" value="${db.driver}" /> 
   <property name="url" value="${pub.db.jdbc.url}" />  
  <property name="username" value="${db.login.name}"></property> 
  <property name="password" value="${db.login.password}" /> 
  <property name="filters" value="${db.filters}"></property> 
  <property name="maxActive" value="${db.pool.maxActive}"></property> 
  <property name="initialSize" value="${db.pool.initialSize}"></property> 
  <property name="minIdle" value="${db.pool.minIdle}"></property> 
  <property name="maxWait" value="${db.maxWait}"></property>   
  <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"></property> 
  <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"></property> 
  <property name="validationQuery" value="${db.validationQuery}"></property> 
  <property name="testWhileIdle" value="${db.testWhileIdle}"></property> 
  <property name="testOnBorrow" value="${db.testOnBorrow}"></property> 
  <property name="testOnReturn" value="${db.testOnReturn}"></property> 
  <property name="poolPreparedStatements" value="${db.poolPreparedStatements}"></property> 
  <property name="maxOpenPreparedStatements" value="${db.maxOpenPreparedStatements}"></property> 
  <!-- 監(jiān)控數(shù)據(jù)庫 --> 
   <property name="proxyFilters"> 
     <list> 
       <ref bean="log-filter" /> 
     </list>  
   </property> 
   
</bean> 

2.定義一個類繼承AbstractRoutingDataSource實現(xiàn)determineCurrentLookupKey方法,該方法可以實現(xiàn)數(shù)據(jù)庫的動態(tài)切換,如下:

public class DynamicDataSource extends AbstractRoutingDataSource { 
  @Override 
  protected Object determineCurrentLookupKey() { 
    return DataSourceContextHolder.getDataSourceType(); 
  } 
} 

3.定義一個可以設置當前線程的變量的工具類,用于設置對應的數(shù)據(jù)源名稱:

public class DataSourceContextHolder { 
  private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 
  /** 
   * @Description: 設置數(shù)據(jù)源類型 
   * @param dataSourceType 數(shù)據(jù)庫類型 
   * @return void 
   * @throws 
   */ 
  public static void setDataSourceType(String dataSourceType) { 
    contextHolder.set(dataSourceType); 
  } 
   
  /** 
   * @Description: 獲取數(shù)據(jù)源類型 
   * @param 
   * @return String 
   * @throws 
   */ 
  public static String getDataSourceType() { 
    return contextHolder.get(); 
  } 
   
  /** 
   * @Description: 清除數(shù)據(jù)源類型 
   * @param 
   * @return void 
   * @throws 
   */ 
  public static void clearDataSourceType() { 
    contextHolder.remove(); 
  } 
} 

然后在spring中配置,如下:

 <!-- 編寫spring 配置文件的配置多數(shù)源映射關系 --> 
<bean class="com.sino.access.database.DynamicDataSource" id="dataSource"> 
  <property name="targetDataSources"> 
    <map key-type="java.lang.String"> 
      <entry value-ref="testDataSource1" key="<span >testDataSource1</span><span >"></entry></span> 
      <entry value-ref="testDataSource2" key="testDataSource2"></entry> 
    </map> 
  </property> 
  <property name="defaultTargetDataSource" ref="testDataSource1"> 
  </property> 
</bean> 
 </bean>

這樣配置兩個數(shù)據(jù)源對應的key分別為testDataSource1和testDataSource2,默認數(shù)據(jù)庫是testDataSource。

4.完成以上步驟后,如果沒有數(shù)據(jù)庫的事務管理,已經(jīng)可以實現(xiàn)數(shù)據(jù)庫的動態(tài)切換了。但是如果涉及到數(shù)據(jù)庫的事務管理,需要在數(shù)據(jù)庫事務開啟切換數(shù)據(jù)庫,

否則數(shù)據(jù)庫的切換只能在下次數(shù)據(jù)庫操作時才生效??梢远x一個aop處理類在數(shù)據(jù)庫事務開啟之前切換數(shù)據(jù)庫,如下:

public class DataSourceAspect implements MethodBeforeAdvice,AfterReturningAdvice  
{ 
 
  @Override 
  public void afterReturning(Object returnValue, Method method, 
      Object[] args, Object target) throws Throwable { 
    // TODO Auto-generated method stub 
    DataSourceContextHolder.clearDataSourceType(); 
  } 
 
  @Override 
  public void before(Method method, Object[] args, Object target) 
      throws Throwable { 
   
    if (method.isAnnotationPresent(DataSource.class))  
    { 
      DataSource datasource = method.getAnnotation(DataSource.class); 
      DataSourceContextHolder.setDataSourceType(datasource.name()); 
    } 
    else 
    { 
      DataSourceContextHolder.setDataSourceType(SinoConstant.DataSourceType.unityDataSource.toString()); 
    } 
     
  } 
} 

5.設置數(shù)據(jù)庫事務切面和切換數(shù)據(jù)庫切面執(zhí)行的順序,如下:

<aop:config> 
  <aop:pointcut id="transactionPointCut" expression="execution(* com.test.service.*.*(..))" /> 
  <aop:advisor pointcut-ref="transactionPointCut" 
    advice-ref="txAdvice" order="2" /> 
  <aop:advisor advice-ref="dataSourceExchange" pointcut-ref="transactionPointCut" order="1"/> 
</aop:config> 

利用aop的order屬性設置執(zhí)行的順序,這樣實現(xiàn)了帶事務管理的spring數(shù)據(jù)庫動態(tài)切換。

看完上述內容,你們掌握使用Spring如何實現(xiàn)配置多個數(shù)據(jù)源的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

新聞標題:使用Spring如何實現(xiàn)配置多個數(shù)據(jù)源
當前網(wǎng)址:http://aaarwkj.com/article34/gihdse.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、外貿(mào)網(wǎng)站建設、靜態(tài)網(wǎng)站、響應式網(wǎng)站品牌網(wǎng)站制作、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司
色橹橹欧美午夜精品福利| 欧美日韩精品激情一区二区| 日本av人妻在线观看| 熟女人妻精品一二三四| 亚洲国产精品福利在线| 国产精品国产三级国av麻豆| 一本久道久久综合久久鬼色| 欧美日韩国产特级性生活| 一区二区三区四区蜜桃av| 久久久这里只有精品99| 肉肉开房天天操夜夜操| 欧美色高清视频在线播放| 日本中文字幕不卡在线一区二区| 亚洲成综合人在线播放| 六十路人妻一区二区三区| 蜜臀在线免费观看av| 久久99热这里只频精品| 国产成人av麻豆色哟哟| 日本人妻丰满熟妇久久| 亚洲精品综合在线二区| 九九热精品在线观看视频| av天堂午夜在线观看| 欧美香蕉一区二区视频| 久久精品高潮999久久久| 中文字幕在线成人影院| 日韩精品有码在线视频免费观看| 亚洲天堂成人综合在线| 欧美日韩亚洲中文二区| 尤物在线免费观看视频| 久久裸体国语精品国产91| 婷婷亚洲五月伊人91| 亚洲欧美综合伊人看片综合| 欧美色精品人妻在线最新| 年轻的少妇一区二区三区| 女同一区二区三区在线| 国产精品一区二区激情视频| 国产丝袜美腿诱惑久久| 自偷自拍亚洲综合精品| 欧美色欧美亚洲另类视频| 精品亚洲天堂一区二区三区| 日韩爱视频一区二区|