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

Spring配置動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離的方法

 更新時間:2017年01月19日 10:52:54   作者:簡單的土豆  
這篇文章主要介紹了利用Spring配置動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離的方法,文中通過示例代碼介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,藕需要的朋友可以一起學(xué)習(xí)學(xué)習(xí)。

前言

最近因為工作的需要,要搭建的一個項目需要實現(xiàn)數(shù)據(jù)源的讀寫分離,在這里將代碼進(jìn)行分享,有需要的朋友們可以參考學(xué)習(xí)。

首先是配置數(shù)據(jù)源

<!--讀數(shù)據(jù)源配置-->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!--寫數(shù)據(jù)源配置-->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!-- 動態(tài)數(shù)據(jù)源 -->
<bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" > 
 <!-- 已配置的數(shù)據(jù)源 --> 
 <property name="targetDataSources">  
 <map>   
  <entry key="READ" value-ref="readDataSource"/>   
  <entry key="WRITE" value-ref="writeDataSource"/>  
 </map> 
 </property> 
 <!-- 默認(rèn)的數(shù)據(jù)源 --> 
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

數(shù)據(jù)源是如何切換的呢?通過動態(tài)數(shù)據(jù)源的配置我們知道原來是通過key來進(jìn)行切換,這里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,我們可以編寫自己的動態(tài)數(shù)據(jù)源類DynamicDataSource來繼承它。

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

還需要一個存放key的地方DataSourceContextHolder 為保證切換時線程安全我們使用ThreadLocal來保存我們的key。

public class DataSourceContextHolder {
 private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);
 public static final String DATA_SOURCE_WRITE = "WRITE";
 public static final String DATA_SOURCE_READ = "READ";
 // 線程本地環(huán)境
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

 // 設(shè)置數(shù)據(jù)源類型
 public static void setType(String type) {
  if(LOGGER.isDebugEnabled())
   LOGGER.debug("==============切換數(shù)據(jù)源,類型:"+type+"================");
  contextHolder.set(type);
 }
 // 獲取數(shù)據(jù)源類型
 public static String getType() {
  return (contextHolder.get());
 }
 // 清除數(shù)據(jù)源類型
 public static void clearType() {
  contextHolder.remove();
 }
}

好了,我們可以通過操作DataSourceContextHolder來實現(xiàn)數(shù)據(jù)源動態(tài)的切換了。小伙伴們可能會說了,難道每次調(diào)用方法都要手動選擇要切換的數(shù)據(jù)源類型?當(dāng)然不是啦,Spring AOP登場。

@Component
@Aspect
public class DynamicDataSourceAspect {

 @Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")
 public void readMethodPointcut() {}

 @Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")
 public void writeMethodPointcut() {}

 @Before("readMethodPointcut()")
 public void switchReadDataSource(){
  //System.out.println("============切換到讀數(shù)據(jù)源===========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);
 }

 @Before("writeMethodPointcut()")
 public void switchWriteDataSource(){
  //System.out.println("=============切換到寫數(shù)據(jù)源==========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);
 }

}

總結(jié)

好啦,以上就是這篇文章的全部內(nèi)容了,在訪問Mapper(本項目使用的是MyBatis啦,相當(dāng)于是DAO)中查詢方法時會切換到讀數(shù)據(jù)源,增、刪、改方法會切換到寫數(shù)據(jù)源。希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

最新評論

双江| 新宾| 财经| 伊宁县| 尼木县| 射洪县| 开鲁县| 峡江县| 秀山| 古田县| 肇东市| 游戏| 三河市| 儋州市| 芒康县| 彭山县| 昌乐县| 安岳县| 金坛市| 平凉市| 景谷| 清涧县| 普格县| 杭州市| 西平县| 黄浦区| 云梦县| 华阴市| 拜城县| 柯坪县| 曲靖市| 乐山市| 龙山县| 安宁市| 平阴县| 大渡口区| 什邡市| 互助| 贵州省| 那曲县| 浙江省|