最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問題

 更新時(shí)間:2017年09月29日 08:25:15   作者:eastday  
下面小編就為大家?guī)硪黄鉀Qspring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一個(gè)項(xiàng)目中需要使用兩個(gè)數(shù)據(jù)庫(kù),Oracle 和Mysql,于是參考各個(gè)blog,實(shí)現(xiàn)此功能。寫好后才發(fā)現(xiàn),原來的事務(wù)失效了,我去...

spring-mybatis.xml 配置

<bean id="configReader" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>classpath:spring/db.properties</value>
   </list>
  </property>
  <property name="ignoreResourceNotFound" value="true"/>
 </bean>

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${jdbc.oracle.DriverClassName}"></property>
  <property name="jdbcUrl" value="${jdbc.oracle.Url}"></property>
  <property name="user" value="${jdbc.oracle.UserName}"></property>
  <property name="password" value="${jdbc.oracle.UserPassword}"></property>

  <property name="acquireIncrement" value="5"></property>
  <property name="initialPoolSize" value="5"></property>
  <property name="maxIdleTime" value="60"></property>
  <property name="maxPoolSize" value="100"></property>
  <property name="minPoolSize" value="5"></property>
 </bean>


 <!-- 配置數(shù)據(jù)源:MySQL start -->
 <bean name="mySqlDataSource" class="com.alibaba.druid.pool.DruidDataSource"
   init-method="init" destroy-method="close">
  <property name="driverClassName" value="${jdbc.mysql.DriverClassName}"/>
  <property name="url" value="${jdbc.mysql.Url}"/>
  <property name="username" value="${jdbc.mysql.UserName}"/>
  <property name="password" value="${jdbc.mysql.UserPassword}"/>

  <!-- 初始化連接大小 -->
  <property name="initialSize" value="5"/>
  <!-- 連接池最大使用連接數(shù)量 -->
  <property name="maxActive" value="30"/>
  <!-- 連接池最小空閑 -->
  <property name="minIdle" value="2"/>
  <!-- 獲取連接最大等待時(shí)間 -->
  <property name="maxWait" value="300"/>

  <property name="validationQuery" value="SELECT 1"/>
  <property name="testOnBorrow" value="false"/>
  <property name="testOnReturn" value="false"/>
  <property name="testWhileIdle" value="true"/>

  <!-- 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 -->
  <property name="timeBetweenEvictionRunsMillis" value="10000"/>
  <!-- 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 -->
  <property name="minEvictableIdleTimeMillis" value="30000"/>

  <!-- 打開removeAbandoned功能 -->
  <property name="removeAbandoned" value="true"/>
  <!-- 1800秒,也就是30分鐘 -->
  <property name="removeAbandonedTimeout" value="1800"/>
  <!-- 關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志 -->
  <property name="logAbandoned" value="true"/>

  <!-- 監(jiān)控?cái)?shù)據(jù)庫(kù) -->
  <property name="filters" value="stat"/>
 </bean>


 <bean id="multipleDataSource" class="com.we.database.MultipleDataSource">
  <property name="defaultTargetDataSource" ref="dataSource"/>
  <property name="targetDataSources">
   <map>
    <entry key="oracleDataSource" value-ref="dataSource"/>
    <entry key="mySqlDataSource" value-ref="mySqlDataSource"/>
   </map>
  </property>
 </bean>

 <!-- oracle myBatis file -->
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="multipleDataSource"/>
  <!--<property name="configLocation" value="classpath:configuration.xml" /> -->
  <property name="mapperLocations" value="classpath:com/we/dao/mapper/*.xml"/>
 </bean>

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.we.dao"/>
  <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
 </bean>


 <!-- configure transaction -->
 <bean id="transactionManager"
   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
 </bean>

 <!-- annotation transaction -->
 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>


 <!-- interception transatcion -->
 <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="add*" propagation="REQUIRED"/>
  </tx:attributes>
 </tx:advice>

 <!-- 配置數(shù)據(jù)庫(kù)注解aop -->
 <bean id="dataSourceAspect" class="com.we.database.DataSourceAspect"/>

 <aop:config>
  <aop:pointcut id="transactionPointcut" expression="execution(* com.wewe.licai.service..*Impl.*(..))"/>
  <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" order="2"/>

  <!--數(shù)據(jù)源選擇切面,保證在事務(wù)開始之前執(zhí)行-->
  <aop:advisor pointcut-ref="transactionPointcut" advice-ref="dataSourceAspect" order="1" />
 </aop:config>

注解切換,默認(rèn)使用oracle數(shù)據(jù)源

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})

public @interface DataSource {
  String name() default DataSource.oracleDataSource;
  String mySqlDataSource = "mySqlDataSource";
  String oracleDataSource = "oracleDataSource";
}

注解方式實(shí)現(xiàn)切換數(shù)據(jù)源,搜索注釋,更換注釋上面的數(shù)據(jù)源,支持類注釋和方法注釋

/**
 * Created by eastday on 2017/9/21.
 */
public class DataSourceAspect implements MethodBeforeAdvice,AfterReturningAdvice
{

 @Override
 public void afterReturning(Object returnValue, Method method,
        Object[] args, Object target) throws Throwable {

  MultipleDataSource.clearDataSource();
 }

 @Override
 public void before(Method method, Object[] args, Object target)
   throws Throwable {

  //首先取類上的數(shù)據(jù)源
  if(method.getDeclaringClass().isAnnotationPresent(DataSource.class) && !method.isAnnotationPresent(DataSource.class)) {

   DataSource datasource = method.getDeclaringClass().getAnnotation(DataSource.class);
   MultipleDataSource.setDataSource(datasource.name());

   //方法上的數(shù)據(jù)源 優(yōu)先級(jí)高于類上的
  } else if (method.isAnnotationPresent(DataSource.class)) {

   DataSource datasource = method.getAnnotation(DataSource.class);
   MultipleDataSource.setDataSource(datasource.name());
  }
  else
  {
   MultipleDataSource.setDataSource(DataSource.oracleDataSource);
  }
 }
}

繼承AbstractRoutingDataSource實(shí)現(xiàn)數(shù)據(jù)源切換

public class MultipleDataSource extends AbstractRoutingDataSource {
 private static final ThreadLocal<String> dataSources = new InheritableThreadLocal<String>();

 public static void setDataSource(String dataSource) {
  dataSources.set(dataSource);
 }

 //清除數(shù)據(jù)源
 public static void clearDataSource() {
  dataSources.remove();
 }

 @Override
 protected Object determineCurrentLookupKey() {
  return dataSources.get();
 }
}

使用demo

@DataSource(name = DataSource.mySqlDataSource)
public class ContentServiceImpl implements IContentService {

 @Autowired
 private IContentDao contentDao;

 @Override
 public Content queryOne(String type) {
  return contentDao.queryOne(type);
 }
}

以上這篇解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中char對(duì)應(yīng)的ASCII碼的轉(zhuǎn)化操作

    java中char對(duì)應(yīng)的ASCII碼的轉(zhuǎn)化操作

    這篇文章主要介紹了java中char對(duì)應(yīng)的ASCII碼的轉(zhuǎn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java快速批量移動(dòng)文件的實(shí)現(xiàn)方法

    Java快速批量移動(dòng)文件的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java快速批量移動(dòng)文件的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-03-03
  • SpringBoot web靜態(tài)資源配置詳解

    SpringBoot web靜態(tài)資源配置詳解

    這篇文章主要介紹了SpringBoot web靜態(tài)資源配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot項(xiàng)目創(chuàng)建使用+配置文件+日志文件詳解

    SpringBoot項(xiàng)目創(chuàng)建使用+配置文件+日志文件詳解

    Spring的出現(xiàn)是為了簡(jiǎn)化 Java 程序開發(fā),而 SpringBoot 的出現(xiàn)是為了簡(jiǎn)化 Spring 程序開發(fā),這篇文章主要介紹了SpringBoot項(xiàng)目創(chuàng)建使用+配置文件+日志文件,需要的朋友可以參考下
    2023-02-02
  • SpringCloud中Gateway的使用教程詳解

    SpringCloud中Gateway的使用教程詳解

    SpringCloud?Gateway是Spring體系內(nèi)的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。本文就來為大家詳細(xì)講講Gateway的使用教程,需要的可以參考一下
    2022-08-08
  • Java中的Kotlin?內(nèi)部類原理

    Java中的Kotlin?內(nèi)部類原理

    這篇文章主要介紹了Java中的Kotlin?內(nèi)部類原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • IDEA運(yùn)行SpringBoot項(xiàng)目的圖文教程

    IDEA運(yùn)行SpringBoot項(xiàng)目的圖文教程

    本文主要介紹了IDEA運(yùn)行SpringBoot項(xiàng)目的圖文教程,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • spring 如何將配置信息注入靜態(tài)變量的方法

    spring 如何將配置信息注入靜態(tài)變量的方法

    本篇文章主要介紹了spring 如何將配置信息注入靜態(tài)變量的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java接口自動(dòng)化測(cè)試框架設(shè)計(jì)之Get請(qǐng)求方法和測(cè)試詳解

    Java接口自動(dòng)化測(cè)試框架設(shè)計(jì)之Get請(qǐng)求方法和測(cè)試詳解

    這篇文章主要介紹了Java接口自動(dòng)化測(cè)試框架設(shè)計(jì) Get請(qǐng)求方法和測(cè)試,框架設(shè)計(jì)我們只是介紹基本的組件,而且框架設(shè)計(jì)沒有想象那么難,一步一步跟著做就會(huì)了。這篇我們來演示,如果通過Java代碼來實(shí)現(xiàn)一個(gè)用純代碼實(shí)現(xiàn)Http中的Get請(qǐng)求過程,需要的朋友可以參考下
    2019-07-07
  • idea中如何去掉不想commit的文件

    idea中如何去掉不想commit的文件

    這篇文章主要介紹了idea中如何去掉不想commit的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

株洲县| 阜康市| 武威市| 南陵县| 锡林浩特市| 文安县| 祁连县| 桐城市| 娄底市| 商洛市| 肥城市| 略阳县| 辛集市| 宜丰县| 易门县| 桐梓县| 桂平市| 家居| 永嘉县| 化隆| 三门峡市| 神池县| 和硕县| 平利县| 思茅市| 沈丘县| 姜堰市| 蒲城县| 当阳市| 米泉市| 龙州县| 武清区| 娄底市| 土默特左旗| 甘南县| 泾源县| 永丰县| 玉田县| 崇信县| 石楼县| 海门市|