利用AbstractRoutingDataSource實現動態資料來源切換 (一、Spring+Hibernate)
package com.hoo.framework.spring.interceptor;
import java.lang.reflect.Proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.ClassUtils;
import org.springframework.beans.factory.InitializingBean;
import com.hoo.framework.log.ApplicationLogging;
import com.hoo.framework.spring.support.CustomerContextHolder;
/**
* <b>function:</b> 動態設定資料來源攔截器
* @author hoojo
* @createDate 2013-9-27 下午02:00:13
* @file DataSourceMethodInterceptor.java
* @package com.hoo.framework.spring.interceptor
* @project SHMB
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
public class DataSourceMethodInterceptor extends ApplicationLogging implements MethodInterceptor, InitializingBean {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Class<?> clazz = invocation.getThis().getClass();
String className = clazz.getName();
if (ClassUtils.isAssignable(clazz, Proxy.class)) {
className = invocation.getMethod().getDeclaringClass().getName();
}
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
trace("execute {}.{}({})", className, methodName, arguments);
if (className.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (className.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else if (methodName.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (methodName.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else {
CustomerContextHolder.clearCustomerType();
}
/*
if (className.contains("MySQL") || methodName.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (className.contains("Oracle") || methodName.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else {
CustomerContextHolder.clearCustomerType();
}
*/
Object result = invocation.proceed();
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
log.trace("afterPropertiesSet……");
}
}
相關推薦
利用AbstractRoutingDataSource實現動態資料來源切換 (一、Spring+Hibernate)
package com.hoo.framework.spring.interceptor; import java.lang.reflect.Proxy; import org.aopalliance.intercept.MethodInterceptor; import org.aopalli
Spring(AbstractRoutingDataSource)實現動態資料來源切換
單個數據源繫結給sessi
AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析
# AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析 > 寫在前面,專案中用到了動態資料來源切換,記錄一下其執行機制。 ## 程式碼展示 下面列出一些關鍵程式碼,後續分析會用到 1. 資料配置 ```java @Configuration @PropertySou
AbstractRoutingDataSource動態資料來源切換,AOP實現動態資料來源切換
AbstractRoutingDataSource動態資料來源切換 上週末,室友通宵達旦的敲程式碼處理他的多資料來源的問題,搞的非常的緊張,也和我聊了聊天,大概的瞭解了他的業務的需求。一般的情況下我們都是使用SSH或者SSM框架進行處理我們的資料來源的資
SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP實現多資料來源切換
一、整合SpringJDBC 1 JDBC JDBC(Java Data Base Connectivity,Java 資料庫連線)是一種用於執行 SQL 語句的 Java API,可以為多種關係資料庫提供統一訪問,它由一組用 Java 語言編寫的類和介面組成。JDBC 提
Spring使用Spring的AbstractRoutingDataSource實現多資料來源切換
最近因為專案需要在做兩個專案間資料同步的需求,具體是專案1的資料通過訊息佇列同步到專案2中,因為這個更新操作還涉及到更新多個庫的資料,所以就需要多資料來源切換的操作。下面就講講在Spring中如何進行資料來源切換。這裡是使用AbstractRoutingDataSource類
Spring AOP實現Mysql資料庫主從切換(一主多從)
設定資料庫主從切換的原因:資料庫中經常發生的是“讀多寫少”,這樣讀操作對資料庫壓力比較大,通過採用資料庫叢集方案, 一個數據庫是主庫,負責寫;其他為從庫,負責讀,從而實現讀寫分離增大資料庫的容錯率。 那麼,對資料庫的要求是: 1. 讀庫和寫庫的資料一致; 2. 寫資料
SSH實現動態資料來源切換
目錄: SSH的整合: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns
底部導航欄實現頁面的切換(一):Fragment + LinearLayout + TextView
Fragment + LinearLayout + TextView 實現底部導航欄的切換(一) 知識點 先看效果圖: 專案結構圖: 實現邏輯: 頂部是Linea
SpringBoot+Mybatis 實現動態資料來源切換方案
背景 最近讓我做一個大資料的系統,分析了一下,麻煩的地方就是多資料來源切換抽取資料。考慮到可以跨伺服器跨資料庫抽數,再整理資料,就配置了這個動態資料來源的解決方案。在此分享給大家。 實現方案 資料庫配置檔案 我們專案使用的是yml形式的配置檔案,採用的是hikari的資料庫連線池。第一步我們自然是配置多個數據
SpringBoot框架:通過AOP和自定義註解完成druid連線池的動態資料來源切換(三)
一、引入依賴 引入資料庫連線池的依賴——druid和麵向切面程式設計的依賴——aop,如下所示: <!-- druid --> <dependency> <groupId
UDP千兆乙太網FPGA_verilog實現(一、知識蒐集)
2018年11月11日 星期日 近段時間打算在FPGA——quartus上實現千兆乙太網 一、對網絡卡的重新認識: 網絡卡工作在ISO/OSI的最後兩層:物理層和資料鏈路層。 1、物理層:定義了資料傳送與接收所需要的電光訊號、線路狀態、資料編碼和電路等等,並向資料鏈路層裝置提供標準介面。
三種實現動態代理方式(jdk、cglib、javaassist)
在編寫程式與實現某些功能時,我們經常會使用到動態代理。動態代理是個很簡單但是很有效的東西。在我們平時使用的框架中,像servlet的filter、包括spring提供的aop以及struts2的攔截器都使用了動態代理功能。我們日常看到的mybatis分頁外掛,以及日誌攔截、
利用tkinter實現簡單計算器功能(不使用eval函式)
利用tkinter實現簡單計算器功能(不使用eval函式) 一、思路 tkinter: 佈置主介面; 上部為數字顯示介面; 下部為數字鍵與功能鍵介面; 邏輯: 程式只考慮兩個運算元進行計算的情況,不考慮複雜情況 展示:
怎樣在程式中利用C++支援多國語言(一種解決方案)
emule是利用動態載入資源DLL來實現多語言切換的,每一個資源DLL中包含了一份對應某一語言的字串表。在原始碼的srchybrid/lang 路徑上可以發現一個lang解決方案,其中包含了差不多40個專案,每個專案編譯出來都是一個單獨的DLL。這些DLL在程式安裝時拷貝到指定的目錄中。每個DLL裡面都
記錄開發Nodejs c++ addon的一些經驗(一、技術棧)
c++編寫 fstream href ren http lan www. 記錄 ref Nodejs c++ addon 是用c++去編寫Nodejs的插件 技術棧: 1、node-gyp 一個用於把c++文件編譯成node可執行文件的庫 2、v8 google
從零開始搭建自己的VueJS2.0+ElementUI單頁面網站(一、環境搭建)
如圖所示 增刪改 type default sdn orm rain exp 名稱 原網址:https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以說是近些年來最火的前端框架之一,越來越多的
Vue 性能優化篇(一、圖片優化 )
vue iconfont tinypng 一、圖片保存階段 ps 或 sketch 等圖片,保存時或保存後,使用photoshop 1、.jpg 圖片選擇 “連續” 2、.png圖片選擇 “優化” 二、 圖片壓縮 1、訪問 https://tinypng.com/
JavaSE之三個特殊類(一、String類)
String類的兩種例項化方式 (1)、直接賦值: public class Test1{ public static void main(String[] args) { String str = "hello"; // str是一個物件,
SpringMVC學習筆記(一、環境搭建)
SpringMVC主要功能 在獲取多個引數、檔案上傳、servlet功能單一方面都有很好的解決辦法 SpringMVC 環境搭建 構建一個空的WEB專案(記住勾選xml檔案) 匯入所需jar包 書寫主配置檔案: 建立resource資料夾 建立spring