使用Spring多数据源配置

 更新时间:2024年07月15日 08:50:19   作者:程序三两行  
这篇文章主要介绍了使用Spring多数据源配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring多数据源配置

Spring多数据源配置,这里持久层框架使用mybatis,集成Mybatis多数据源有两种方式:

1、创建多个SqlSessionFactory,扫描每个SqlSessionFactoryBean对应的包,形成了每个Factory对应一个数据源。

2、创建一个SqlSessionFactory,通过动态切换数据源对象,达到多数据源操作功能。

方式一:创建多个SqlSessionFactory

  • 整合mysql+clickhouse双数据源
<!--mybatis + mysql + druid-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.23</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>
    <!--clickhouse-->
    <dependency>
      <groupId>ru.yandex.clickhouse</groupId>
      <artifactId>clickhouse-jdbc</artifactId>
      <version>0.1.53</version>
    </dependency>
  • jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.master.url=jdbc:mysql://localhost:3306/test
jdbc.master.username=root
jdbc.master.password=root
jdbc.master.maxActive=10
jdbc.master.minIdle=5
jdbc.master.maxWait=10000
  • clickhouse.properties
clickhouse.driverClassName=ru.yandex.clickhouse.ClickHouseDriver
clickhouse.url=jdbc:clickhouse://localhost:8123/test
clickhouse.username=root
clickhouse.password=root
clickhouse.maxActive=10
clickhouse.minIdle=5
clickhouse.maxWait=10000
  • spring配置文件中配置多个数据源
<!--加载mysql+clickhouse配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <context:property-placeholder location="classpath:clickhouse.properties"/>

    <!--=======================mysql数据源配置=======================-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.master.url}"/>
        <property name="password" value="${jdbc.master.password}"/>
        <property name="username" value="${jdbc.master.username}"/>
        <property name="maxActive" value="${jdbc.master.maxActive}"/>
        <property name="maxWait" value="${jdbc.master.maxWait}"/>
        <property name="minIdle" value="${jdbc.master.minIdle}"/>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.demo.flash.price.redpot.entity"/>
        <property name="mapperLocations" value="classpath:mysql_mapper/*.xml"/>
        <property name="plugins">
            <set>
                <!--配置pageHelper 分页插件-->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <!--方言:-->
                            <prop key="helperDialect">mysql</prop>
                        </props>
                    </property>
                </bean>
            </set>
        </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.demo.flash.price.redpot.mapperMysql"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!--=======================clickhouse数据源配置=======================-->
    <bean id="dataSourceClickhouse" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${clickhouse.driverClassName}"/>
        <property name="url" value="${clickhouse.url}"/>
        <property name="password" value="${clickhouse.password}"/>
        <property name="username" value="${clickhouse.username}"/>
        <property name="maxActive" value="${clickhouse.maxActive}"/>
        <property name="maxWait" value="${clickhouse.maxWait}"/>
        <property name="minIdle" value="${clickhouse.minIdle}"/>
    </bean>
    <bean id="sqlSessionFactoryClickhouse" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="dataSource" ref="dataSourceClickhouse"/>
        <property name="typeAliasesPackage" value="com.demo.flash.price.redpot.entity"/>
        <property name="mapperLocations" value="classpath:clickhouse_mapper/*.xml"/>
        <property name="plugins">
            <set>
                <!--配置pageHelper 分页插件-->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <!--方言:-->
                            <prop key="helperDialect">mysql</prop>
                        </props>
                    </property>
                </bean>
            </set>
        </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.demo.flash.price.redpot.mapperClickhouse"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryClickhouse"/>
    </bean>
    <bean id="transactionManagerClickhouse"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSourceClickhouse"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManagerClickhouse" />

方式二:动态切换数据源对象

创建单个SqlSessionFactory,动态切换数据源对象 ,在Spring的jdbc包下有个支持动态数据源切换的抽象类AbstractRoutingDataSource,其中的抽象方法determineCurrentLookupKey需要我们自己来实现,到底返回哪个数据源

public class DynamicDataSource extends AbstractRoutingDataSource {
 
	@Override
	protected Object determineCurrentLookupKey() {
        //在这里做数据源切换
		return DataSourceTypeManager.get();
	}
 
}
public class DataSourceTypeManager {
    //数据源保存
	private static final ThreadLocal<MybatisDataSource> dataSourceTypes = new ThreadLocal<MybatisDataSource>() {
		 
		@Override
		protected MybatisDataSource initialValue() {
			return MybatisDataSource.JKDSJ;
	}
	};
 
	public static MybatisDataSource get() {
		return dataSourceTypes.get();
	}
 
	public static void set(MybatisDataSource dataSourceType) {
		dataSourceTypes.set(dataSourceType);
	}
 
	public static void reset() {
		dataSourceTypes.set(MybatisDataSource.JKDSJ);
	}
 
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中使用MinIO的常用操作示例

    Java中使用MinIO的常用操作示例

    这篇文章主要介绍了Java中MinIO的常用操作示例,MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统,客户端支持Java,Net,Python,Javacript, Golang语言,需要的朋友可以参考下
    2024-01-01
  • Java中的匿名内部类小结

    Java中的匿名内部类小结

    java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
    2016-07-07
  • Spring Boot整合流控组件Sentinel的场景分析

    Spring Boot整合流控组件Sentinel的场景分析

    Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑,这篇文章主要介绍了Spring Boot整合流控组件Sentinel的过程解析,需要的朋友可以参考下
    2021-12-12
  • java JVM方法分派模型静态分派动态分派全面讲解

    java JVM方法分派模型静态分派动态分派全面讲解

    这篇文章主要为大家介绍了java JVM方法分派模型静态分派动态分派全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Springboot 多租户SaaS搭建方案

    Springboot 多租户SaaS搭建方案

    这篇文章主要介绍了Springboot 多租户SaaS方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • JAVA实现双向链表的增删功能的方法

    JAVA实现双向链表的增删功能的方法

    本篇文章主要介绍了JAVA实现双向链表的增删功能的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 一文快速了解spring boot中的@idempotent注解

    一文快速了解spring boot中的@idempotent注解

    idempotence注解是RESTful API设计中一个重要的概念,它可以保证操作的可靠性和一致性,下面这篇文章主要给大家介绍了关于spring boot中@idempotent注解的相关资料,需要的朋友可以参考下
    2024-01-01
  • Javaweb实战之实现蛋糕订购系统

    Javaweb实战之实现蛋糕订购系统

    随着网络的普及与发展,网上购物逐渐成为一种主流消费的方式。这篇文章主要介绍了通过JavaWeb制作一个线上蛋糕订购系统,文中示例代码讲解详细,需要的朋友可以参考一下
    2021-12-12
  • SpringBoot使用Jackson配置全局时间日期格式

    SpringBoot使用Jackson配置全局时间日期格式

    本文主要介绍了SpringBoot使用Jackson配置全局时间日期格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Mybatis中自定义实例化SqlSessionFactoryBean问题

    Mybatis中自定义实例化SqlSessionFactoryBean问题

    这篇文章主要介绍了Mybatis中自定义实例化SqlSessionFactoryBean问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论