1. 程式人生 > >Spring Boot HikariCP 一 ——整合多資料來源

Spring Boot HikariCP 一 ——整合多資料來源

其實這裡介紹的東西主要是參考的另外一篇文章,資料庫讀寫分離的。

讀寫分離的功能我已經使用replication整合好了,因為我們需要單獨設定每個資料來源的連結屬性,而且使用的還是Hikari資料來源,所以又在網上找了兩天,最終昨天晚上發現了這種方式。
我這裡說說自己整合的時候的一些注意點。

配置檔案:

hikari:
  master:
    jdbc-url: jdbc:mysql://masterhost:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false
username: root password: root maximum-pool-size: 20 pool-name: master connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1765000 slave: jdbc-url: jdbc:mysql://slavehost:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false
username: root password: root maximum-pool-size: 80 pool-name: slave connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1765000 read-only: true

我這裡主要用到的是maximum-pool-size這個值,一般情況下讀資料庫(slave)總會比寫(master)要多一些,而且往往是一個master多個slave。所以,maximum-pool-size這個值在master的設定小於slave比較高效。

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author Created by pangkunkun on 2017/12/18.
 */
@Component
@ConfigurationProperties(prefix = "hikari")
public class DBProperties {
    private HikariDataSource master;
    private HikariDataSource slave;

    public HikariDataSource getMaster() {
        return master;
    }

    public void setMaster(HikariDataSource master) {
        this.master = master;
    }

    public HikariDataSource getSlave() {
        return slave;
    }

    public void setSlave(HikariDataSource slave) {
        this.slave = slave;
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Created by pangkunkun on 2017/12/18.
 */
@Configuration
@EnableScheduling
public class DataSourceConfig {

    @Autowired
    private DBProperties properties;

    @Bean(name = "dataSource")
    public DataSource dataSource() {
        //按照目標資料來源名稱和目標資料來源物件的對映存放在Map中
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("master", properties.getMaster());
        targetDataSources.put("slave", properties.getSlave());
        //採用是想AbstractRoutingDataSource的物件包裝多資料來源
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);
        //設定預設的資料來源,當拿不到資料來源時,使用此配置
        dataSource.setDefaultTargetDataSource(properties.getMaster());
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}
import com.easyar.cloud.cms.common.util.TargetDataSource;
import org.aspectj.lang.JoinPoint;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @author Created by pangkunkun on 2017/12/18.
 */
@Component
@Aspect
public class DataSourceAspect {


    private final static Logger log= LoggerFactory.getLogger(DataSourceAspect.class);

    //切換放在mapper介面的方法上,所以這裡要配置AOP切面的切入點
    @Pointcut("execution( * com.easyar.cloud.cms.dao.mapper.*.*(..))||execution( * com.easyar.cloud.cms.shiro.mapper.*.*(..))")
    public void dataSourcePointCut() {
    }

    @Before("dataSourcePointCut()")
    public void before(JoinPoint joinPoint) {
        Object target = joinPoint.getTarget();
        String method = joinPoint.getSignature().getName();
        Class<?>[] clazz = target.getClass().getInterfaces();
        Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
        try {
            Method m = clazz[0].getMethod(method, parameterTypes);
            //如果方法上存在切換資料來源的註解,則根據註解內容進行資料來源切換
            if (m != null && m.isAnnotationPresent(TargetDataSource.class)) {
                TargetDataSource data = m.getAnnotation(TargetDataSource.class);
                String dataSourceName = data.value();
                DynamicDataSourceHolder.putDataSource(dataSourceName);
                log.debug("current thread " + Thread.currentThread().getName() + " add " + dataSourceName + " to ThreadLocal");
            } else {
                log.debug("switch datasource fail,use default");
            }
        } catch (Exception e) {
            log.error("current thread " + Thread.currentThread().getName() + " add data to ThreadLocal error", e);
        }
    }

    //執行完切面後,將執行緒共享中的資料來源名稱清空
    @After("dataSourcePointCut()")
    public void after(JoinPoint joinPoint){
        DynamicDataSourceHolder.removeDataSource();
    }

}

上面這些程式碼的結合充分的解決了在看其他文章的時候對資料來源引入的部分疑問。
DBProperties這裡直接將配置檔案中的配置引數通過spring的註解讀取對映成HikariDataSource,在DataSourceConfig 將其載入。

文章中@TargetDataSource的註解是在mapper方法上,但是事物註解@Transactional一般都是在serviceImpl上,當@Transactional先於@TargetDataSource生效的時候根據自己的設定往往會找到預設的資料來源(我設定的是master)。

後來仔細想了下,將@Transactional註解由原來的類註解改為具體到方法上,而且一般用到@Transactional的地方都是增刪改,而且只要涉及到增刪改的請求(即使可能附帶查詢)都是要使用master資料來源的。所以,最終我們將@Transactional註解指定到具體某個增刪改的方法上,@TargetDataSource依然是在mapper的方法中。

這裡寫的東西不多,具體的還是參考人家的原文吧,如果有啥問題可以給我留言大家一起探討。

相關推薦

Spring Boot HikariCP ——整合資料來源

其實這裡介紹的東西主要是參考的另外一篇文章,資料庫讀寫分離的。 讀寫分離的功能我已經使用replication整合好了,因為我們需要單獨設定每個資料來源的連結屬性,而且使用的還是Hikari資料來源,所以又在網上找了兩天,最終昨天晚上發現了這種方式。

Spring Boot2.0之整合資料來源

  一般公司分兩個資料庫:  一個放共同配置檔案, 一個數據庫垂直業務資料庫 垂直拆分和水平拆分:   垂直是根據業務劃分具體資料庫    在一個專案中有多個數據源(不同庫jdbc) 無限個的哈~ 根據包名 或者 註解方式 劃分多個數據源 &nb

spring boot 註解方式配置資料來源與使用

1、首先看一下application-dev.yml 配置 spring:     datasource:         type: com.alibaba.druid.pool.Dru

Spring Boot MyBatis配置Druid資料來源(附原始碼)

Spring Boot MyBatis配置Druid多資料來源 回顧在Spring中配置MyBatis SqlSessionFactory的配置: <!-- mybatis 的SqlSessionFactory --> <bean id="sqlSessionF

Spring Boot + MyBatis + Pagehelper 配置資料來源

package top.cmnbgy.springbootibatismulidatasource.dataSource; import com.alibaba.druid.pool.DruidDataSource; import org.apache.ibatis.session.SqlSessionF

Spring boot 瞭解(五)(配置資料來源)

一個專案裡面訪問多個數據庫的操作,記錄如下: (學習地址:https://www.majiaxueyuan.com/front/couinfo/36) 目錄 1.application.properties檔案配置 2.建立Configure 3.建立mapper 4.執

spring boot中使用druid資料來源配置Mybatis

首選必須吐槽下,不知道是我讀書太少,還是Spring boot確實對druid和mybatis的支援不好,奈何用怪了druid的資料庫、sql、url監控和mybatis資料來源,只有硬著頭皮上了。 相關配置 常例先給出build.gradle配置 "or

Spring boot 2.0+ MyBatis 資料來源Mysql)

業務的需求需要兩個在不同伺服器的資料庫。 首先確定Springboot版本,我這裡引用的是2.0.0 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g

spring-boot (四) springboot+mybatis資料來源最簡解決方案

配置檔案 pom包就不貼了比較簡單該依賴的就依賴,主要是資料庫這邊的配置: mybatis.config-locations=classpath:mybatis/mybatis-config.xml spring.datasource.test1.driverClassName = com.

(2)、Spring Boot與Mybatis的整合( 資料來源)

1、背景的介紹有時候我們需要做分庫分表,那麼肯定存在多資料來源,Spring Boot和Mybatis的多資料來源是如何整合的呢?比如說我們現在做了一個浪跡天涯管理的後臺系統,商品資訊是存在itemCenter資料來源中的,而與使用者相關的資訊是存在account資料來源中,

spring boot2.0+shiro+mybatis資料來源+druid連線池專案整合

關於整合    網上關於springboot2.0和shiro+myabtis整合的案例很少,大神的教程也是用jpa編寫,jpa很方便,但是還有很多人用mybatis,加之剛學習完mybatis多資料來源整合和druid連線池監控配置,所以算是階段性記錄。 專案目

Spring Boot使用spring-data-jpa配置Mysql資料來源

轉載請註明出處 :Spring Boot使用spring-data-jpa配置Mysql多資料來源 我們在之前的文章中已經學習了Spring Boot中使用mysql資料庫 在單資料來源的情況下,Spring Boot的配置非常簡單,只需要在application.propert

深入Spring Boot (十):整合Redis詳解

Spring Boot為Redis的Lettuce和Jedis客戶端庫提供了基本的自動配置,並且可以使用Spring Data Redis完成更多的操作。本篇將介紹如何整合Redis及使用Redis實現簡單的查詢快取,主要包括以下7部分內容: 快取 Redi

轉 jenkins-整合git ssh maven spring-boot實現鍵部署啟動

安裝好jenkins java maven git ssh 點選“系統管理”配置一下工具 配置jdk 配置git 配置maven 當然也可以自動安裝,點選apply並儲存 點選系統設定 配置一下發郵件的地址,構建失敗後能郵件通知 ctr

jenkins-整合git ssh maven spring-boot實現鍵部署啟動

安裝好jenkins java maven git ssh 點選“系統管理”配置一下工具 配置jdk 配置git 配置maven 當然也可以自動安裝,點選apply並儲存 點選系統設定 配置一下發郵件的地址,構建失敗後能郵件通知

使用 Spring Boot 搭建套增刪改查(無余代碼)

param tar rim project posit 編輯 word lec char 前言 這是我學習 Spring Boot 的第三篇文章,終於可以見到效果了。錯過的同學可以看看之前的文章 我們為什麽要學習 Spring Boot Spring Boot

HBase 系列(十)—— Spring/Spring Boot + Mybatis + Phoenix 整合

一、前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的關係型資料庫(如 Mysql,Oracle)在配置上是基本相同的,下面會分別給出 Spring/Spring Boot 整合步驟,完整程式碼見本倉庫: Spring + Mybatis + Phoenix SpringBoot

spring boot mybatis 一對一 一對

oct 技術分享 mybatis blog use res pac ase unit pox配置 <!-- mybatis --> <dependency> <groupId>o

Spring boot 學習: 認識Spring boot

XML 過程 maven 認識 很多 團隊 但是 日誌文件 pivotal 什麽是spring boot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人

spring boot 集成kafka (線程,消費者使用kafka的原生api實現,因為@KakfkaListener修改groupId無效)

初始化 接收 .bat truct singleton test ops cati xtend application-test.properties 1 #kafka 2 kafka.consumer.zookeeper.connect=*:2181 3 kafk