1. 程式人生 > >hibernate動態資料來源配置(註解)

hibernate動態資料來源配置(註解)

1.首先需要一個 資料來源型別的類。

 public enum DBType {
      dataSource, frontDataSource;
}

2.需要一個本地執行緒變數物件儲存 資料來源型別,這裡使用的 是ThreadLocal,因為ThreadLocal 可以為每個執行緒單獨創立一個新的副本變數。
public class ContextHolder {
    private static final ThreadLocal<Object> holder = new ThreadLocal<Object>();

    public static void setDbType(DBType dbType) {
        holder.set(dbType);
    }

    public static DBType getDbType() {
        return (DBType) holder.get();
    }

    public static void clearDbType() {
        holder.remove();
    }
}

3.需要一個動態資料來源類用於代替之前的 dataSource bean,這個類需要繼承AbstractRoutingDataSource,並且重寫 determineCurrentLookupKey 方法,返回本地執行緒變數中儲存的 資料來源型別key。

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        DBType key = ContextHolder.getDbType();//獲得當前資料來源識別符號
        System.out.println("當前資料來源 :" + key);
        return key;
    }

}

4.需要一個攔截器,該攔截器可以根據實際情況進行配置,我這裡是攔截 service根據方法名稱去切換資料來源,這裡切記:

[email protected](1) 這個值必須有,因為資料來源的獲取也是通過攔截器中獲取的,這個地方攔截器優先順序必須高過資料來源獲取的攔截器。

[email protected]  註解 需要在application.xml 配置啟用

    <context:component-scan base-package="com">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    <!-- -開啟 aspect 註解使用 -->
    <aop:aspectj-autoproxy />

import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
/**
 *  aop實現動態切換資料來源
 *
 */  
@Aspect  
@Component
@Order(1)
public class DataSourceAopProxy {  
 
    @Before("dataSourcePoint()")
    public  void setDataSource(JoinPoint joinPoint){  
        
        Signature signature = joinPoint.getSignature();  
        MethodSignature methodSignature = (MethodSignature) signature;  
        Method method = methodSignature.getMethod();  
        
        //此處進行切換資料來源   根據業務條件   獲取資料來源id  
        if(method.getName().contains("Front")){
             ContextHolder.setDbType(DBType.frontDataSource);
            
            
             System.out.println("設定當前資料來源 DBType.frontDataSource");
        }else{
             ContextHolder.setDbType(DBType.dataSource);
            
             System.out.println("設定當前資料來源 DBType.dataSource");
        }
    
        
       
    }  
 
    
    @After("dataSourcePoint()")
    public  void after(JoinPoint joinPoint){  
        
        System.out.println("清除 DB type!");
        ContextHolder.clearDbType();
    }  
    
    
    //@Pointcut("execution(* com.dao.impl.*.*(..))")
    @Pointcut("execution(* com.service.impl.*.*(..))")
    private void dataSourcePoint(){  
       
    }
}

5.需要配置兩個資料來源和上面的資料來源型別對應,我這裡${jdbc.url}是讀取的屬性檔案,你們可以在這裡直接寫值

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialPoolSize" value="${connection_pools.initial_pool_size}" />
        <property name="minPoolSize" value="${connection_pools.min_pool_size}" />
        <property name="maxPoolSize" value="${connection_pools.max_pool_size}" />
        <property name="maxIdleTime" value="${connection_pools.max_idle_time}" />
        <property name="acquireIncrement" value="${connection_pools.acquire_increment}" />
        <property name="checkoutTimeout" value="${connection_pools.checkout_timeout}" />
    </bean>
    
    
    <bean id="frontDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${front.jdbc.driver}" />
        <property name="jdbcUrl" value="${front.jdbc.url}" />
        <property name="user" value="${front.jdbc.username}" />
        <property name="password" value="${front.jdbc.password}" />
        <property name="initialPoolSize" value="${connection_pools.initial_pool_size}" />
        <property name="minPoolSize" value="${connection_pools.min_pool_size}" />
        <property name="maxPoolSize" value="${connection_pools.max_pool_size}" />
        <property name="maxIdleTime" value="${connection_pools.max_idle_time}" />
        <property name="acquireIncrement" value="${connection_pools.acquire_increment}" />
        <property name="checkoutTimeout" value="${connection_pools.checkout_timeout}" />
    </bean>

6.需要 修改 bean為entityManagerFactory的配置,其中將dataSource屬性配置為 mysqlDynamicDataSource,如下:

    <property name="dataSource" ref="mysqlDynamicDataSource" />

7.最後一步,配置 bean mysqlDynamicDataSource,對應上一步。

a.此處bean中targetDataSources 為目標資料來源,key-type 值為資料來源型別類,也就是第一條那個列舉。

b.map 中的key  對應的是資料來源型別中的 兩個列舉值,value-ref 則是第五條 配置的兩個bean。

c.defaultTargetDataSource 為預設的資料來源型別,就是本地執行緒變數中值 為null而預設的資料來源物件。   

     <bean id="mysqlDynamicDataSource" class="com.titanos.dynamic.DynamicDataSource">
        <property name="targetDataSources">
            <!-- 識別符號型別 -->
            <map key-type="com.dynamic.DBType">
                <entry key="dataSource" value-ref="dataSource"/>
                <entry key="frontDataSource" value-ref="frontDataSource"/>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSource"/>
    </bean>

相關推薦

hibernate動態資料來源配置(註解)

1.首先需要一個 資料來源型別的類。  public enum DBType {       dataSource, frontDataSource; } 2.需要一個本地執行緒變數物件儲存 資料來源型別,這裡使用的 是ThreadLocal,因為ThreadLocal 可

Spring Boot整合Hibernate(多資料來源配置).md

配置資料來源: 定義兩個DataSource用來讀取application.properties中的不同配置: @Configuration public class DataSourceConfig { @Bean(

SpringBoot 動態資料來源註解切換

使用版本SpringBoot 1.5.9 動態切換資料來源,mysql ,oracle 在專案中動態切換,或者 兩個mysql進行切換 引入依賴 <dependency> <groupId>com.alibaba</groupId&g

spring動態資料來源配置以及以及利用AOP自動設定

這個問題其實網上有很多的解決辦法。但是我在借鑑的時候,還是碰到了很多問題,有很多地方不明白。最後經過綜合參考幾篇博文,自己測試實驗,終於把問題解決了。在這裡記錄下來,避免以後我或者大家再遇到這樣的問題。 我主要參考的文章有: 1、Spring(AbstractRouting

SpringBoot進行MySql動態資料來源配置實現讀寫分離(連線池Druid)

1.簡介 前面使用C3P0連線池進行過資料庫的讀寫分離的實驗,今天換一下資料庫連線池改造一下,原理還是和原來的一樣。 Druid是阿里出品,淘寶和支付寶專用資料庫連線池,但它不僅僅是一個數據庫連線池,它還包含一個ProxyDriver,一系列內建的JDBC元

Srping + JPA + Hibernate資料來源配置

專案中有配置多資料來源的需求,查了一些資料最終實現,主要參考資料: http://www.cnblogs.com/linjiqin/archive/2011/02/12/1952904.html https://my.oschina.net/frankly/blog/277

spring boot + hibernate資料來源註解方式)

一)spring boot  + hibernate 多資料來源(XML) import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.En

java hibernate資料來源配置

這裡的value值是讀取properties檔案裡面的值,因為是多資料來源 所以value值有多個<!-- 配置資料來源 --><bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSo

springboot+mybatis多資料來源配置,AOP註解動態切換資料來源

轉載至:https://blog.csdn.net/xiaosheng_papa/article/details/80218006 親測有效。 注:有些系統中已經配置了單資料來源,現在要轉成多資料來源,可能需要額外的配置。拿我自己當前專案來說: 專案在啟動類中配置了單資料來源:

Hibernate中的一對一註解配置

before code uil ransac ges package open cnblogs 一對一 Card類 package cn.OneToOne2017109.entity; import javax.persistence.*; /** * Creat

Hibernate框架學習之註解配置關系映射

target 列名 獲取 fonts 查詢 conn unique strategy code ?????上篇文章我們通過註解對映射了單個實體類,但是具體項目中往往實體類之間又是相互關聯的,本篇文章就是從實體類之間存在的不同關聯角度,具體學習下如何映射他們之間的關聯,主要涉

解析配置檔案自動裝配 DataSource + AbstractRoutingDataSource + AOP 實現動態資料來源 上:原理解析,解析資料來源

spring boot 自動裝配會通過 spring.datasource.*為我們自動裝配資料來源,所以想要動態的切換資料來源,第一件事是配置資料來源,其次是怎麼切換?最後何時切換? 原理解析(使用 AbstractRoutingDataSource 實現) spring-jd

解析配置檔案自動裝配 DataSource + AbstractRoutingDataSource + AOP 實現動態資料來源 下:配置動態資料來源,AOP 進行使用

上篇文章中已經藉助 DynamicDataSourceBuilder 類從配置檔案中解析得到了預設資料來源和動態資料來源,接下來需要配置動態資料來源的“本體”,並藉助 AOP 動態的切換資料來源。 配置動態資料來源 AbstractRoutingDataSource 實現了 In

springboot+mybatis+druid實現多資料來源配置,支援註解和xml兩種sql書寫方式

https://github.com/cheegoday/springboot-demo-djg 要點: 一、依次建立以下幾個Bean 資料來源:DataSource session工廠:SqlSessionFactory 執行緒安全session:Sql

藉助Spring和自定義註解完成多資料來源配置

前一段時間研究了一下spring多資料來源的配置和使用,為了後期從多個數據源拉取資料定時進行資料分析和報表統計做準備。由於之前做過的專案都是單資料來源的,沒有遇到這種場景,所以也一直沒有去了解過如何配置多資料來源。 後來發現其實基於spring來配置和使用多資

Hibernate Tomcat JNDI資料來源配置(備忘)

簡述: 配置JNDI 查詢Tomcat 中server.xml中定義的資料來源 步驟: 1. 修改elipse的資料來源server.xml 主要修改如下, 1. 新增下面這段Context文字 其中StudentManagementWeb是專案名稱 &l

Springboot中利用aop和註解實現動態資料來源

本篇文章將介紹如何使用AOP和註解來實現動態資料來源. 使用ThreadLocal儲存當前執行緒使用的資料來源的key import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**

spring多資料來源配置+aop註解方式屬性注入

本文將介紹spring中多個數據源的配置,同時使用註解的方式切換選擇資料來源。 spring的其他配置不再細說,只說資料來源的相關配置。 參考多篇博文實踐整理,不在一一查找出處,如有侵權請及時聯絡 ==================================== 1

使用Spring AOP結合自定義Java註解實現動態資料來源設定

1、定義Java註解 @Retention(RetentionPolicy.RUNTIME) // 註解將要寫到型別(Class/Interface)還是其它元素(Method等)上,支援package、type、method、field等,一般只會配置一個@Target

Spring Boot 動態切換資料來源三——動態獲取配置檔案中的配置資訊

這裡是接上篇文章 Spring Boot 動態切換資料來源(負載均衡) 留下的問題,配置檔案中資料庫的資訊更改後代碼中能夠動態獲取。所以這裡重點說下優化後的內容。 先看配置檔案 slave: hosts: slave1,slave2 hikari