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

首頁 > 編程 > JSP > 正文

Spring AOP 動(dòng)態(tài)多數(shù)據(jù)源的實(shí)例詳解

2024-09-05 00:23:21
字體:
供稿:網(wǎng)友

 Spring AOP 動(dòng)態(tài)多數(shù)據(jù)源的實(shí)例詳解

當(dāng)項(xiàng)目中使用到讀寫分離的時(shí)候,我們就會(huì)遇到多數(shù)據(jù)源的問題。多數(shù)據(jù)源讓人最頭痛的,不是配置多個(gè)數(shù)據(jù)源,而是如何能靈活動(dòng)態(tài)的切換數(shù)據(jù)源。例如在一個(gè)spring和Mybatis的框架的項(xiàng)目中,我們?cè)趕pring配置中往往是配置一個(gè)dataSource來連接數(shù)據(jù)庫,然后綁定給sessionFactory,在dao層代碼中再指定sessionFactory來進(jìn)行數(shù)據(jù)庫操作。

 Spring,AOP,動(dòng)態(tài)多數(shù)據(jù)源,詳解

正如上圖所示,每一塊都是指定綁死的,如果是多個(gè)數(shù)據(jù)源,也只能是下圖中那種方式。

Spring,AOP,動(dòng)態(tài)多數(shù)據(jù)源,詳解

可看出在Dao層代碼中寫死了兩個(gè)SessionFactory,這樣日后如果再多一個(gè)數(shù)據(jù)源,還要改代碼添加一個(gè)SessionFactory,顯然這并不符合開閉原則。

那么正確的做法應(yīng)該是:

Spring,AOP,動(dòng)態(tài)多數(shù)據(jù)源,詳解

具體代碼與配置如下:

1、applicationContext-mgr.xml

<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:aop="http://www.springframework.org/schema/aop"  xmlns:context="http://www.springframework.org/schema/context"   xmlns:tx="http://www.springframework.org/schema/tx"  xmlns:p="http://www.springframework.org/schema/p"  xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  <!-- use annotation -->  <context:annotation-config />    <context:component-scan base-package="com.carl.o2o.**.mgr">  </context:component-scan>  <!-- master -->  <bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="driverClass" value="${driverClassName_master}"/>    <property name="user" value="${username_master}"/>    <property name="password" value="${password_master}"/>    <property name="jdbcUrl" value="${url_master}?Unicode=true&characterEncoding=UTF-8&allowMultiQueries=true"/>    <property name="maxPoolSize" value="150"/>     <property name="minPoolSize" value="10"/>     <property name="initialPoolSize" value="20"/>     <property name="maxIdleTime" value="3600"/>     <property name="acquireIncrement" value="10"/>     <property name="idleConnectionTestPeriod" value="1800"/>    </bean>  <!-- slave -->  <bean id="slave" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="driverClass" value="${driverClassName_slave}"/>    <property name="user" value="${username_slave}"/>    <property name="password" value="${password_slave}"/>    <property name="jdbcUrl" value="${url_slave}?Unicode=true&characterEncoding=UTF-8"/>    <property name="maxPoolSize" value="150"/>     <property name="minPoolSize" value="10"/>     <property name="initialPoolSize" value="20"/>     <property name="maxIdleTime" value="3600"/>     <property name="acquireIncrement" value="10"/>     <property name="idleConnectionTestPeriod" value="1800"/>    </bean>  <!-- spring 動(dòng)態(tài)數(shù)據(jù)源 -->  <bean id="dynamicDataSource" class="com.carl.dbUtil.DynamicDataSource">    <property name="targetDataSources">       <map key-type="java.lang.String">         <entry key="slave" value-ref="slave" />       </map>     </property>     <property name="defaultTargetDataSource" ref="master" />     </bean>   <!-- mybatis mapper config -->  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="dynamicDataSource"/>    <property name="configLocation" value="classpath:o2o_mybatis_config.xml"/>    <property name="mapperLocations" >      <list>        <value>classpath:sqlMap/*.xml</value>        <value>classpath*:/com/carl/o2o/**/*.xml</value>      </list>    </property>  </bean>  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">    <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>  </bean>  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    <property name="basePackage" value="com.carl.o2o.**.mgr.dao" />  </bean>  <!-- 多數(shù)據(jù)源 aop -->  <bean id="DataSourceAspect" class="com.carl.dbUtil.DataSourceAspect" />  <aop:config>     <aop:advisor pointcut="execution(* com.carl.o2o.mgr.*.*(..))" advice-ref="DataSourceAspect" />  </aop:config>   <!-- 事務(wù) -->  <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">      <property name="dataSource" ref="dynamicDataSource"></property>  </bean> </beans>

2、DynamicDataSource

DynamicDataSource使用Spring中的代碼結(jié)合AOP實(shí)現(xiàn)多數(shù)據(jù)源切換.

public class DynamicDataSource extends AbstractRoutingDataSource {  public DynamicDataSource() {  }  protected Object determineCurrentLookupKey() {    return DBContextHolder.getDbType();  }  public Logger getParentLogger() {    return null;  }}

3、DBContextHolder

DynamicDataSource的輔助類,用于實(shí)際的切換多數(shù)據(jù)源。

public class DBContextHolder {  private static ThreadLocal<String> contextHolder = new ThreadLocal();  public static String MASTER = "master";  public static String SLAVE = "slave";  public DBContextHolder() {  }  public static String getDbType() {    String db = (String)contextHolder.get();    if(db == null) {      db = MASTER;    }    return db;  }  public static void setDbType(String str) {    contextHolder.set(str);  }  public static void setMaster() {    contextHolder.set(MASTER);  }  public static void setSlave() {    contextHolder.set(SLAVE);  }  public static void clearDBType() {    contextHolder.remove();  }}

4、DataSourceAspect

多數(shù)據(jù)源AOP切面編程實(shí)現(xiàn)。

public class DataSourceAspect implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {  private static final Logger log = LogManager.getLogger(DataSourceAspect.class);  public DataSourceAspect() {  }  public void before(Method m, Object[] args, Object target) throws Throwable {    try {      if(m != null) {        if((m.getName().startsWith("list") || m.getName().startsWith("select") || m.getName().startsWith("get")         || m.getName().startsWith("count")) && !m.getName().contains("FromMaster")) {          DBContextHolder.setDbType("slave");        } else {          DBContextHolder.setDbType("master");        }      }    } catch (Exception var5) {      log.error("data source aspect error.", var5);    }  }  public void after(JoinPoint point) {    log.info("clear db type after method.current id {}", new Object[]{Long.valueOf(Thread.currentThread().getId())});    DBContextHolder.clearDBType();  }  public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {  }  public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {    log.info("current db type {} when exception", new Object[]{DBContextHolder.getDbType()});    DBContextHolder.setDbType("master");  }}

以上就是 Spring AOP 動(dòng)態(tài)多數(shù)據(jù)源的實(shí)例詳解,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JSP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久久7777| 中文字幕5566| 欧美日本韩国国产| 国产免费不卡视频| 欧美大陆国产| 国产女优一区| 日本中文字幕免费| 亚洲高清免费在线| 欧美日韩国产中文精品字幕自在自线| 91国产精品视频在线观看| 高清在线视频不卡| 成人在线播放av| 国语对白在线刺激| 黄网在线观看网址入口| 麻豆精品国产传媒| 成人av免费电影| 欧美大喷水吹潮合集在线观看| 少妇人妻精品一区二区三区| 久久99热这里只有精品国产| 国产综合久久久久久鬼色| 欧美第一黄网免费网站| 亚洲欧美综合图片| 激情小说综合区| 国产精品国产自产拍高清av水多| 97人人模人人爽人人喊中文字| 欧美国产二区| 国产激情在线免费观看| 欧美91福利在线观看| 黄色av一区二区| 日韩电影免费在线观看网站| 奇米影视888狠狠狠| 国产午夜精品理论片a级探花| 丰满人妻一区二区三区免费视频棣| 色噜噜一区二区| 尤物在线视频观看| 婷婷久久久久久| 日本视频www| 日本人妻一区二区三区| 免费日韩电影在线观看| 99re国产在线播放| 正在播放亚洲精品| 久久婷婷五月综合色丁香| 9i精品一二三区| 中文字幕一二三区| 午夜精品影视国产一区在线麻豆| 欧洲免费在线视频| 悠悠色在线精品| 国产乱叫456| 99精品人妻国产毛片| 欧美日韩亚洲一区二区| 偷拍自拍亚洲色图| 在线观看av网站永久| 国产va免费精品高清在线| 一个人免费播放在线视频看片| 97人妻精品一区二区三区| 国产亚洲精品美女久久久| 夜色福利资源站www国产在线视频| 亚洲一级一区| 色婷婷成人综合| 国产精品久久久久久妇女| 亚洲一区二区三区免费看| 91佛爷在线| 久久青青草原亚洲av无码麻豆| 狠狠色丁香九九婷婷综合五月| 欧美在线视频在线播放完整版免费观看| 欧美日韩在线观看不卡| 在线国产视频| 成人在线视频免费观看| 成人午夜激情影院| 欧美日韩经典丝袜| 韩国中文免费在线视频| 亚洲免费视频中文字幕| 淫视频在线观看| 91精品产国品一二三产区| 国产精品国产三级国产专业不| 激情亚洲综合在线| 国产精品亚洲综合在线观看| 男男视频在线观看网站| 日本aⅴ免费视频一区二区三区| 7777精品伊人久久久大香线蕉超级流畅| 中文字幕欧美日本乱码一线二线| 日本成人在线免费视频| 亚洲福利av在线| 中文一区二区视频| 国产一二三四五| 国精产品一区二区三区| 香蕉影院在线| 亚洲人成网77777色在线播放| 欧美特黄一级大片| 日本一区二区三区久久| 九九在线免费视频| 欧美乱妇40p| 国产一区二区播放| 51一区二区三区| 亚洲精品720p| 欧美黑人xxxx猛牲大交| 久久久国产精品黄毛片| 美女脱光衣服与内衣内裤一区二区三区四区| 中文字幕一区二区人妻电影丶| 免费日韩成人| 69久久夜色精品国产69| 亚洲女人18毛片水真多| 亚洲va国产日韩欧美精品色婷婷| 日韩欧美在线视频播放| 日本a级c片免费看三区| 亚洲欧洲日产国产网站| 欧美天堂在线观看| 日韩 欧美一区二区三区| 色狠狠色狠狠综合| 久久久久无码精品国产| 免费一级欧美在线观看视频| 舐め犯し波多野结衣在线观看| 色91精品久久久久久久久| 欧美r级电影| aaa一区二区| 成人av网站免费观看| 韩日三级av| 国产无遮挡又黄又爽在线观看| 中文字幕日产av一二三区| 国产一区二区精品丝袜| 人妻一区二区三区四区| 嫩草在线视频| 99视频在线观看一区三区| 色综合色综合色综合色综合色综合| 91精品福利视频| 91亚洲精品久久久蜜桃网站| 精品一区久久久久久| 欧美xxxxx在线视频| 小早川怜子一区二区三区| 美乳在线观看| 高清国产一区二区| 日韩一区二区在线播放| 精品国产黄色片| 一个人看的日本www的免费视频| 一区二区在线观看免费视频| 国产精品稀缺呦系列在线| 国产精品大尺度| 亚洲欧美偷拍另类| 亚洲精品乱码久久久久久金桔影视| 69堂免费精品视频在线播放| 999免费视频| 久久久久国产成人精品亚洲午夜| 国精品人伦一区二区三区蜜桃| 1313精品午夜理伦电影| 麻豆国产精品官网| 亚洲欧洲日产国产综合网| 免费成人av网站| 在线看黄网址| 特级西西人体www高清大胆| 人妻熟妇乱又伦精品视频| 国产高清日韩| 国内精品伊人久久久久影院对白| 亚洲自拍偷拍二区| 国产福利电影在线| 1024成人网色www| 中文字幕1区2区| 亚洲一区精品在线观看| 亚洲另类第一页| 久久精品影视| 日韩欧美一区二区一幕| theporn国产精品| 午夜精品久久久久久| 人成免费电影一二三区在线观看| 清纯唯美亚洲综合一区| 91精品久久久久久综合乱菊| 欧美a免费在线| 在线码字幕一区| 中文字幕国产视频| 最新91在线| 成人video亚洲精品| av网在线播放| 色天天色综合| 国产美女精品人人做人人爽| 免费xxxxx网站中文字幕| 欧美老妇交乱视频| 国产精品久久久久久av下载红粉| 日本高清视频免费在线观看| 麻豆影视在线| 欧美成人在线直播| 亚洲午夜网未来影院| 国产又大又黄的视频| 国产超碰在线| 97在线播放免费观看| 欧美xxx在线| 欧美激情亚洲综合一区| 97精品久久久午夜一区二区三区| 三上悠亚在线一区二区| 欧美日韩在线一区二区| 国产裸体无遮挡| av免费网站观看| 蜜臀精品一区二区三区| 激情视频在线观看一区二区三区| 日本三日本三级少妇三级66| 免费看成人午夜电影| 亚洲国产日韩欧美在线观看| 欧美日韩成人影院| 69视频在线| 中文字幕 国产精品| 国产精品第四页| 国产精品久久久久毛片| 日韩久久久久久久久久久| 国产亚洲精品7777| 亚洲精品永久免费视频| 国产草草浮力影院| 99re久久精品国产| 精品国产免费一区二区三区香蕉| 日本特黄久久久高潮| 无码人妻精品一区二区蜜桃色欲| 成人精品视频一区| 国产婷婷色一区二区三区四区| 日韩欧美一中文字暮专区| 国产视频手机在线观看| 国产宾馆自拍| a级片在线观看视频| 98精品久久久久久久| 精品国产91久久久久久浪潮蜜月| 免费麻豆国产一区二区三区四区| 国产一区二区在线观看视频| 波多野结衣视频网站| 国内一卡2卡三卡四卡在线| 欧美污在线观看| 亚洲国产日韩a在线播放| 亚洲日韩第九十九页| 免费毛片b在线观看| 国产亚洲欧美激情| 午夜视频福利在线观看| 国产欧美在线观看一区| 色综合久久88色综合天天| 国产一区二区三区精彩视频| 亚洲成a人片| 亚洲欧美日本韩国| 国产三级电影在线播放| 亚洲欧美中文日韩在线| 777片理伦片在线观看| 激情欧美一区| 欧美精品一区二区三区涩爱蜜| 异国色恋浪漫潭| 在线观看免费国产小视频| 日本人妻丰满熟妇久久久久久| 午夜精品在线免费观看| 粉嫩粉嫩芽的虎白女18在线视频| 免费看国产曰批40分钟| 成年网站免费入口在线观看| 成人欧美magnet| 亚洲va久久久噜噜噜无码久久| 精品一区二区三区在线观看| 精品一区二区三区四| 中文字幕黄色片| 国产一区二区三区美女| 日韩精品中文字幕在线| 日韩av在线资源| 亚洲爆乳无码专区| 日韩三级视频中文字幕| 亚洲精品1234| 高清成人在线观看| 欧美国产高潮xxxx1819| 国产午夜视频在线播放| 激情综合色播五月| 69av视频在线| 免费在线观看日韩| 狠狠色狠狠色综合日日tαg| 97伦理在线四区| 国产精品久久亚洲7777| 亚洲色偷偷色噜噜狠狠99网| 亚洲国产天堂久久综合| 成人乱码一区二区三区av| 俺来也官网欧美久久精品| 亚洲国产aⅴ成人精品无吗| 天天摸天天做天天爽水多| 午夜宅男久久久| 中文字幕制服丝袜| 91亚洲精品国产| 毛片在线导航| 精品国产伦一区二区三区| 国产亚洲欧美在线| 国内精品视频一区二区三区| 色偷偷88欧美精品久久久| 日日摸夜夜添夜夜添精品视频| 久久午夜鲁丝片午夜精品| 欧美日韩精品在线一区二区| www中文字幕| 色欧美在线观看| 95精品视频在线| 国产69精品久久久久久久久久| 日韩精品久久久久久久的张开腿让| 国产无遮挡裸体视频在线观看| 欧美变态挠脚心| 久久99久久久欧美国产| 国产婷婷精品av在线| 欧美久久久久久久久久久久| 日韩欧美视频一区二区三区四区| 亚洲婷婷综合色高清在线| 日韩电影免费在线观看中文字幕| 欧美亚洲日本在线观看| 强乱中文字幕av一区乱码| 情侣黄网站免费看| 久久精品人人做人人综合| 国产欧美日韩一区二区三区在线观看| 日本理论片午伦夜理片在线观看| 久久精品女人的天堂av| 日产国产精品精品a∨| 久久久久久无码精品大片| 国产福利片一区二区| 91日本在线观看| 中文字幕永久在线观看| 亚洲激情在线| 亚洲永久精品免费| 中文字幕一区二区三区人妻不卡| 亚洲国产高清在线观看| 国产一区二区女内射| 国产精品9999久久久久仙踪林| 欧美xxxx做受欧美护士| 黄色成人免费观看| 伦理电影国产精品| 黄色一级大片在线免费看国产一| 正在播放日韩欧美一页| 亚洲一区二区三区中文字幕在线| 中国一级特黄视频| 久久久久天天天天| 欧美videofree性高清杂交| 在线观看入口黄最新永久免费国产| 日韩欧美亚洲一区二区三区| 久热精品在线播放| 国产精品一国产精品k频道56| 久久综合色播五月| 色婷婷狠狠五月综合天色拍| 国产精品入口麻豆九色| 日韩精品综合一本久道在线视频|