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

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

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

前言

最近因為工作的需要,要搭建的一個項目需要實現(xiàn)數(shù)據(jù)源的讀寫分離,在這里將代碼進行分享,有需要的朋友們可以參考學(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> 
 <!-- 默認的數(shù)據(jù)源 --> 
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

數(shù)據(jù)源是如何切換的呢?通過動態(tài)數(shù)據(jù)源的配置我們知道原來是通過key來進行切換,這里要使用到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)文章

最新評論

泰州市| 湖北省| 闽清县| 鄯善县| 内黄县| 镇原县| 涞源县| 巍山| 丹凤县| 凤山市| 通化县| 通州市| 台前县| 佛冈县| 张家港市| 建宁县| 威宁| 石屏县| 星子县| 隆尧县| 佛冈县| 平泉县| 宜宾县| 浮梁县| 承德市| 韶山市| 苗栗县| 汶上县| 牟定县| 高阳县| 辉县市| 安多县| 娄烦县| 潜山县| 潼南县| 新平| 利辛县| 开平市| 呼玛县| 东山县| 平南县|