国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > Java > 正文

mysql+spring+mybatis實現數據庫讀寫分離的代碼配置

2024-07-14 08:43:47
字體:
來源:轉載
供稿:網友

場景:一個讀數據源一個讀寫數據源。

原理:借助spring的【org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource】這個抽象類實現,看名字可以了解到是一個路由數據源的東西,這個類中有一個方法

/**  * Determine the current lookup key. This will typically be  * implemented to check a thread-bound transaction context.  * <p>Allows for arbitrary keys. The returned key needs  * to match the stored lookup key type, as resolved by the  * {@link #resolveSpecifiedLookupKey} method.  */ protected abstract Object determineCurrentLookupKey(); 

每次去連數據庫的時候,spring會調用這個方法去找對應的數據源。返回值即對應的數據源的LookUpKey.那么這個LookUpKey在哪定義的呢?看下面的dataBase.xml的配置

<!--數據源 讀寫 --> <bean id="dataSourceRW" class="org.logicalcobwebs.proxool.ProxoolDataSource">   <property name="alias" value="ihotelRW"></property>   <property name="delegateProperties">     <value>user=${jdbc.username},password=${jdbc.password}     </value>   </property>   <property name="user" value="${jdbc.username}" />   <property name="password" value="${jdbc.password}" />   <property name="driver" value="${jdbc.driverClassName}" />   <property name="driverUrl" value="${jdbc.url}" />   <property name="maximumConnectionCount" value="${jdbc.maximumConnectionCount}"></property>   <property name="maximumActiveTime" value="${jdbc.maximumActiveTime}"></property>   <property name="maximumConnectionLifetime" value="${jdbc.maximumConnectionLifetime}"></property>   <property name="prototypeCount" value="${jdbc.prototypeCount}"></property>   <property name="houseKeepingSleepTime" value="${jdbc.houseKeepingSleepTime}"></property>   <property name="simultaneousBuildThrottle" value="${jdbc.simultaneousBuildThrottle}"></property>   <property name="houseKeepingTestSql" value="${jdbc.houseKeepingTestSql}"></property>   <property name="verbose" value="${jdbc.verbose}"></property>   <property name="statistics" value="${jdbc.statistics}"></property>   <property name="statisticsLogLevel" value="${jdbc.statisticsLogLevel}"></property> </bean>   <!--數據源 讀-->   <bean id="dataSourceR" class="org.logicalcobwebs.proxool.ProxoolDataSource">     <property name="alias" value="ihotelR"></property>     <property name="delegateProperties">       <value>user=${jdbc.r.username},password=${jdbc.r.password}       </value>     </property>     <property name="user" value="${jdbc.r.username}" />     <property name="password" value="${jdbc.r.password}" />     <property name="driver" value="${jdbc.r.driverClassName}" />     <property name="driverUrl" value="${jdbc.r.url}" />     <property name="maximumConnectionCount" value="${jdbc.maximumConnectionCount}"></property>     <property name="maximumActiveTime" value="${jdbc.maximumActiveTime}"></property>     <property name="maximumConnectionLifetime" value="${jdbc.maximumConnectionLifetime}"></property>     <property name="prototypeCount" value="${jdbc.prototypeCount}"></property>     <property name="houseKeepingSleepTime" value="${jdbc.houseKeepingSleepTime}"></property>     <property name="simultaneousBuildThrottle" value="${jdbc.simultaneousBuildThrottle}"></property>     <property name="houseKeepingTestSql" value="${jdbc.houseKeepingTestSql}"></property>     <property name="verbose" value="${jdbc.verbose}"></property>     <property name="statistics" value="${jdbc.statistics}"></property>     <property name="statisticsLogLevel" value="${jdbc.statisticsLogLevel}"></property>   </bean>   <!-- 動態數據源 -->   <bean id="dynamicDataSource" class="com.dao.datasource.DynamicDataSource">     <!-- 通過key-value關聯數據源 -->     <property name="targetDataSources">       <map>         <entry value-ref="dataSourceRW" key="dataSourceKeyRW"></entry>         <entry value-ref="dataSourceR" key="dataSourceKeyR"></entry>       </map>     </property>     <property name="defaultTargetDataSource" ref="dataSourceRW" />     </bean> <!--mybatis與Spring整合 開始 --> <bean id="sqlSessionFactory" name="sqlSessionFactory"   class="org.mybatis.spring.SqlSessionFactoryBean">   <property name="configLocation" value="classpath:conf/core/sqlMapConfig.xml" />   <property name="dataSource" ref="dynamicDataSource" /> </bean> 

動態數據源dynamicDataSource中的dataSourceKeyRW、dataSourceKeyR就是

protected abstract Object determineCurrentLookupKey(); 

這個方法要返回的值。那么如何設置,讓這個方法的返回值是根據我們的需要返回dataSourceKeyRW、dataSourceKeyR呢?由于這個方法沒有入參,并且是spring自動調用的,因此考慮使用靜態變量存儲dataSource的key,在調用sql語句前設置靜態變量的值,然后在這個方法中得到靜態變量的值,返回。又考慮到多線程,同時可能會有很多請求,為避免線程之間相互干擾,考慮使用threadLocal。

先看存儲dataSourceKey的容器類。

public class DBContextHolder {   /**    * 線程threadlocal    */   private static ThreadLocal<String> contextHolder = new ThreadLocal<>();   private String DB_TYPE_RW = "dataSourceKeyRW";   private String DB_TYPE_R = "dataSourceKeyR";   public String getDbType() {     String db = contextHolder.get();     if (db == null) {       db = DB_TYPE_RW;// 默認是讀寫庫     }     return db;   }   /**    * 設置本線程的dbtype    * @param str    * @see [相關類/方法](可選)    * @since [產品/模塊版本](可選)    */   public void setDbType(String str) {     contextHolder.set(str);   }   /**    * clearDBType    * @Title: clearDBType    * @Description: 清理連接類型    */   public static void clearDBType() {     contextHolder.remove();   } } 

動態數據源的實現類。

public class DynamicDataSource extends AbstractRoutingDataSource {   /*    * (non-Javadoc)    * @see javax.sql.CommonDataSource#getParentLogger()    */   @Override   public Logger getParentLogger() throws SQLFeatureNotSupportedException {     // TODO Auto-generated method stub     return null;   }   /**    * override determineCurrentLookupKey    * <p>    * Title: determineCurrentLookupKey    * </p>    * <p>    * Description: 自動查找datasource    * </p>    * @return    */   @Override   protected Object determineCurrentLookupKey() {     return DBContextHolder.getDbType();   } } 

在DAO層中設置數據庫類型。

/**    * 添加郵件    * @param sms    * @return    */   public boolean insertEmail(Email email) {     //根據具體需要設置不同的數據庫     DBContextHolder.setDbType(DBContextHolder.DB_TYPE_RW);     //DBContextHolder.setDbType(DBContextHolder.DB_TYPE_R);     int result = this.getSqlSession().insert(STATEMENT + ".addEntity",         email);     return result == 1;   } 

在本例中,我們是在DAO中指定數據庫,我們也可以根據需要在service或者controller中指定DB類型,需要記住的是setDbType是針對線程維度的。要考慮多線程的問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
麻豆精品永久免费视频| 国产95在线|亚洲| 国产精品免费麻豆入口| eeuss影院在线观看| h网站免费在线观看| av黄色在线观看| 在线观看av资源网| 日本欧洲一区| 国产美女视频网站| 国产视频二区在线观看| 国产一级视频| 99高清免费国产自产拍| 欧美xxxxx性| 国产亚洲依依| 四虎国产精品永久地址998| 青草视频在线播放| 国产人成在线视频| 中文字幕国产在线| 69视频在线| 91caoporn在线| 色综合久久五月天| 国产精品久久久久久精| 全网国产福利在线播放| 国产精彩视频在线观看免费蜜芽| baoyu777.永久免费视频| 麻豆精品不卡国产免费看| 国产日本在线视频| 不卡av免费观看| 中文字幕av免费| 国产一级二级三级在线观看| 精品av中文字幕在线毛片| 国产嫩草在线视频| 在线观看免费视频一区二区三区| 欧洲有码在线视频| 伊人影院在线视频| 国产盗摄一区二区| 国产黄色在线| 国产丝袜在线观看视频| 久久精品视频观看| 美女被人操视频在线观看| 亚洲成人av高清| 亚洲欧美日韩综合精品网| 精品国产一区二区三区四区阿崩| 国产一级激情| 2021天堂中文幕一二区在线观| 国产免费福利| 中文字幕在线播放网址| 五月婷婷丁香激情| 午夜视频免费在线观看| 黄色av网站在线免费观看| www在线视频| 日本高清中文字幕在线 | 中文字幕在线看精品乱码| 开心婷婷激情| 国产免费视频在线| 国产午夜视频在线观看| 国产网站免费看| 91香蕉视频免费在线观看| 国产不卡一卡2卡三卡4卡5卡在线| 国产无套粉嫩白浆在线2022年| 国产精品人人爱一区二区白浆| 一区二区精品区| 在线āv视频| 福利在线国产| 国产精品久久久精品a级小说| 在线中文字幕视频| 国产免费高清| 亚洲人成影院在线| 国产麻豆精品入口在线观看| 国产精品入口麻豆高清| 日本视频一二三区中文字幕| 成人免费一区二区三区视频网站| 国产精品久久久久久久久鸭 | 国产精品99999| xxx国产精品| 国产精品理人伦一区二区三区| 国产一级在线观看| gogogogo高清视频在线| 国产三级在线看| www在线视频| 国产成人亚洲欧美电影| 毛片在线视频| 影音av资源站| 国产二区视频| 天堂在线免费观看| 欧美性猛交xxxx免费看久久| 精精国产xxxx视频在线中文版| 国产麻豆视频网站| 青青草观看免费视频在线| 中文字幕av高清在线观看| 国产日产一区二区三区| 青青草在线播放| www.久草.com| 亚洲精品一线| 亚洲欧美自拍另类| 精品美女调教视频| 99热免费观看| av三级在线观看| 97在线超碰| 亚洲日本伊人| 亚洲夜夜综合| 欧美性受xxxx免费视频| 香蕉视频网站在线播放| 在线免费看黄网站| av免费网站在线观看| 中文在线有码| 国产青草视频在线观看视频| 99视频免费在线观看| 国产午夜三区视频在线| 国产日韩网站| 国产成在线观看免费视频| 精品国产一区二区三区久久久狼牙| 国产福利视频在线| 精品视频vs精品视频| 亚洲精品天堂在线观看| 青青草视频在线免费观看| 欧美黑人乱大交| 国产精品天堂| 国产激情二区| eeuss影院www在线观看| 黄色国产网站在线播放| 黄色片av在线| 国产黄a三级三级三级av在线看| 91精品专区| av在线二区| 中文字幕在线免费观看| 精品国产福利一区二区在线| 日本调教视频在线观看| 国产特黄在线| www.成人.com| 国产精品粉嫩av| 男人天堂v视频| 国产www在线观看| 超碰免费在线观看| 国产videos| 国产蜜臀av在线播放| 国产福利三区| 国产精品自产拍在线观看2019| 在线黄色.com| 国产视频在线播放| 久热中文字幕精品视频在线| 国产二区在线播放| 九九热视频在线观看| av片在线观看| 精品国产免费第一区二区| 成人午夜无人区一区二区| 在线播放国产区| 国产极品美女到高潮| 国产在线中文字幕| 亚洲精品视频在线免费| 国产成人精品久久一区二区小说| 欧美96在线| www网站在线观看| 伊人中文在线| 精品亚洲成a人片在线观看| 综合图区亚洲白拍在线| 久草在线视频网| 免费不卡中文字幕视频 | 樱花草在线观看www| 国产精品你懂的在线观看| 国产精品一区二区三区视频网站 | 国产永久免费| 青青青国产视频| 欧洲一区av| 国产真实伦在线观看| 久色视频在线观看| 黄色毛片在线看| 国产字幕在线看| 中文字幕色视频| 18被视频免费观看视频| 国产超碰精品在线观看| 91青青在线视频| 日本三级在线视频| 欧美专区日韩| 中文字幕在线视频网| 国产小视频福利在线| 国产福利资源| 国产95在线|亚洲| 亚洲一道本在线| 好吊日视频在线观看| 国产网站观看9久| 精品视频vs精品视频| 日本福利在线观看| 国产亚av手机在线观看| 精品一区二区三区高清免费不卡| 精品电影在线| 国产中文在线视频| 91麻豆免费在线视频| 超碰在线免费播放| 国产黄视频网站| 二区中文字幕| 亚洲第一成年免费网站| 国产美女在线看| 亚洲an天堂an在线观看| 国产一级性片| 就爱干草视频| 一级二级在线观看| 国产精品入口麻豆完整版| 男女羞羞视频在线观看| 精品一区二区观看|