Springboot 切换数据源

1.下面是数据库配置文件 pool.properties

#例外
eman.excepts=depv.,
#驱动名称
#master.dataSourceClassName=com.zaxxer.hikari.HikariDataSource
#最小连接空闲数
master.minimumIdle=5
#连接池最大连接数,包括闲置和使用中的连接
master.maximumPoolSize=100
#等待池中连接的最大毫秒数,如果在没有连接可用的情况下超过此时间,则将抛出SQLException
master.connectionTimeout=30000
#连接测试活动的最长时间,该值必须小于connectionTimeout
master.validationTimeout=2000
#测试连接(驱动程序支持JDBC4,不建议设置此属性)
#master.connectionTestQuery=SELECT 1
#池中空闲的最长时间,此设置仅在minimumIdle定义为小于时才适用maximumPoolSize(值为0表示永远不会从池中删除空闲连接.默认值:600000(10分钟))
master.idleTimeout=600000
#池中连接的最长生命周期(值0表示限寿命.默认值:1800000(30分钟))
master.maxLifetime=1800000
#驱动类
master.driverClassName=com.mysql.cj.jdbc.Driver
#连接地址{database}代表映射database值
master.jdbcUrl=jdbc:mysql://localhost:3306/{database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#用户名
master.username=root
#密码,发布时支持sha加密
master.password=
#数据库名称
master.database=
#连接池的定义名称,所有连接配置必填对象
master.poolName=hikariCP-master

slave1.inherit=master
slave1.driverClassName=com.mysql.cj.jdbc.Driver
slave1.jdbcUrl=jdbc:mysql://192.168.10.37:3306/{database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
slave1.username=smy
slave1.password=123456
slave1.database=em
slave1.poolName=hikariCP-slave1
slave1.idleTimeout=600000
slave1.maxLifetime=1765000

2.代码里切换数据库,在事件响应层切换

    DBContextHolder.setDataSourceKey(DataSourceKey.slave1); // 切换数据库
    this.logic.writeI18ns(i18ns);
    DBContextHolder.clearDataSourceKey(); // 删除切换数据库
SpringBoot 中实现动态数据源切换有多种方式,其中一种比较常用的方式是通过使用 AbstractRoutingDataSource 类和 ThreadLocal 来实现。 具体步骤如下: 1. 创建一个继承 AbstractRoutingDataSource 类的类,重写 determineCurrentLookupKey 方法,该方法返回一个字符串作为数据源的 key。 2. 在配置文件中配置多个数据源,每个数据源都需要配置一个 key 作为标识。 3. 在需要进行数据源切换的地方,调用 DataSourceContextHolder 类的 setDataSourceKey 方法设置当前数据源的 key。 4. 在需要使用数据源的地方,通过调用 DataSourceContextHolder 类的 getDataSourceKey 方法获取当前数据源的 key。 5. 在配置类中配置事务管理器时,需要将动态数据源作为参数传递给事务管理器。 示例代码如下: 1. 创建 DynamicDataSource 类 ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } } ``` 2. 在配置文件中配置多个数据源 ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/master username: root password: root driver-class-name: com.mysql.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3. 设置当前数据源的 key ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSourceKey(String key) { contextHolder.set(key); } public static String getDataSourceKey() { return contextHolder.get(); } public static void clearDataSourceKey() { contextHolder.remove(); } } ``` 4. 获取当前数据源的 key ```java String dataSourceKey = DataSourceContextHolder.getDataSourceKey(); ``` 5. 配置事务管理器 ```java @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) { return new DataSourceTransactionManager(dataSource); } ``` 以上是一种常用的动态数据源切换方式,可以根据具体需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值