亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产综合视频在线观看中文| 国产成人免费av| 亚洲美女视频网站| 日韩天堂在线视频| 视频一区视频二区国产精品| 1769国内精品视频在线播放| 国产视频在线一区二区| 亚洲欧美国产精品专区久久| 俺去亚洲欧洲欧美日韩| 亚洲一区二区三区久久| 国产精品自产拍在线观| 亚洲跨种族黑人xxx| 亚洲直播在线一区| 91网站免费看| 国产精品视频一区二区三区四| 成人黄色大片在线免费观看| 亚洲天堂网在线观看| 成人精品一区二区三区| 一本色道久久综合亚洲精品小说| 成人激情在线观看| 97在线免费观看视频| 欧美插天视频在线播放| 久久亚洲私人国产精品va| 亚洲成人久久久| 午夜精品在线观看| 久久久久www| 国产欧美一区二区白浆黑人| 久久精品青青大伊人av| 97视频免费在线看| 亚洲午夜国产成人av电影男同| 久久久免费av| 日韩在线观看精品| 欧美性生交xxxxx久久久| 欧美激情久久久久| 国产亚洲成精品久久| 久久99国产综合精品女同| 色综合久久88| 色综合久久久久久中文网| 久久影院在线观看| 久久久久久久久久久成人| 国产va免费精品高清在线| 亚洲精品久久7777777| 国产一区二区三区毛片| 欧美人交a欧美精品| 久久成人人人人精品欧| 77777亚洲午夜久久多人| 91精品国产高清久久久久久久久| 亚洲性视频网址| 亚洲日韩欧美视频| 在线观看日韩www视频免费| 国产成人免费av电影| 全亚洲最色的网站在线观看| 久久久国产成人精品| 精品激情国产视频| 日韩在线免费av| 亚洲美女精品成人在线视频| 国产日韩欧美在线视频观看| 久久久精品中文字幕| 国产999精品久久久| 美女福利精品视频| 亚洲第一精品自拍| 黑人与娇小精品av专区| 国产精品日韩在线观看| 久久精品视频中文字幕| 久久成人综合视频| 欧美日韩亚洲激情| 亚洲性日韩精品一区二区| 亚洲日本中文字幕免费在线不卡| 亚洲第一页自拍| 久久久久中文字幕2018| 亚洲综合色激情五月| 国产日韩一区在线| 少妇久久久久久| 欧美日韩人人澡狠狠躁视频| 中文字幕免费精品一区高清| 亚洲国产日韩欧美在线动漫| 亚洲护士老师的毛茸茸最新章节| 国产成人aa精品一区在线播放| 久久91精品国产91久久跳| 日韩免费高清在线观看| 亚洲电影免费在线观看| 亚洲香蕉成视频在线观看| 日韩电影免费在线观看| 久久精品中文字幕一区| 欧美日韩国产影院| 最近2019中文字幕一页二页| 亚洲成人精品久久| 亚洲精品乱码久久久久久金桔影视| 精品视频在线播放免| 日韩精品免费在线观看| 91国产高清在线| 日韩有码在线播放| 久久久久久69| 国产aⅴ夜夜欢一区二区三区| 97精品国产97久久久久久春色| 国产一区二区日韩精品欧美精品| 欧美大片va欧美在线播放| 精品视频9999| 亚洲精品福利在线| 亚洲性无码av在线| 深夜精品寂寞黄网站在线观看| 日韩av观看网址| 这里只有精品丝袜| 国内精品久久久久久久久| 久久成年人免费电影| 久久久国产精品x99av| 精品亚洲国产视频| 欧美日韩另类视频| 成人黄色av网| 亚洲男人的天堂在线| 亚洲视频一区二区| 亚洲精品在线看| 97av视频在线| 久久精品99久久香蕉国产色戒| 福利精品视频在线| 久久精品91久久久久久再现| 久久亚洲国产精品| 亚洲国产成人91精品| 国产国产精品人在线视| 91极品女神在线| 国产精品爽黄69天堂a| 日本精品久久电影| 成人中心免费视频| 国产剧情日韩欧美| 精品国产乱码久久久久久虫虫漫画| 日韩视频在线观看免费| 国产精品爽黄69| 日韩美女毛茸茸| 免费成人高清视频| 日韩av资源在线播放| 国产精品xxx视频| 亚洲自拍偷拍色图| 精品久久久久久久久久久| 91深夜福利视频| 亚洲系列中文字幕| 欧美—级高清免费播放| 亚洲影院高清在线| 亚洲国产精品小视频| 91精品视频在线看| 欧美裸体xxxx极品少妇| 欧美激情xxxxx| 亚洲电影免费在线观看| 亚洲国产精品高清久久久| yw.139尤物在线精品视频| 欧美成人在线免费| 亚洲天堂第一页| 亚洲欧美日韩中文在线| 久久91超碰青草是什么| 亚洲精品视频网上网址在线观看| 欧美精品videos性欧美| 亚洲欧美日韩精品久久亚洲区| 亚洲最大福利视频网| 九九精品在线观看| www.99久久热国产日韩欧美.com| 成人亚洲欧美一区二区三区| 中文字幕在线观看日韩| 精品久久久av| 正在播放欧美视频| 国产精品亚洲视频在线观看| 92国产精品久久久久首页| 欧洲成人在线视频| 91国语精品自产拍在线观看性色| 国产偷亚洲偷欧美偷精品| 欧美二区在线播放|