1. 程式人生 > >利用AbstractRoutingDataSource實現動態資料來源切換 (一、Spring+Hibernate)

利用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使用SpringAbstractRoutingDataSource實現資料來源切換

最近因為專案需要在做兩個專案間資料同步的需求,具體是專案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、物理層:定義了資料傳送與接收所需要的電光訊號、線路狀態、資料編碼和電路等等,並向資料鏈路層裝置提供標準介面。

三種實現動態代理方式jdkcglibjavaassist

在編寫程式與實現某些功能時,我們經常會使用到動態代理。動態代理是個很簡單但是很有效的東西。在我們平時使用的框架中,像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