mybatisplus多数据源问题

mybatisplus多数据源配置

链接: mybatisplus官网.
多数据源特性:
支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
支持数据库敏感配置信息 加密 ENC()。
支持每个数据库独立初始化表结构schema和数据库database。
支持 自定义注解 ,需继承DS(3.2.0+)。
提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
简化Druid和HikariCp配置,提供 全局参数配置 。配置一次,全局通用。
提供 自定义数据源来源 方案。
提供项目启动后 动态增加移除数据源 方案。
提供Mybatis环境下的 纯读写分离 方案。
提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
提供对shiro,sharding-jdbc,quartz等第三方库集成的方案,注意事项和示例。
提供 基于seata的分布式事务方案附:不支持原生spring事务。

基本的配置根据官网一步一步来即可

注意点
spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        dynamic:
            primary: system #设置默认的数据源或者数据源组
            strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
            datasource:
                database1:
                    url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=UTF-8&useSSL=false
                    username: username
                    password: password
                    driver-class-name:  com.mysql.cj.jdbc.Driver
                    #连接池可以在每个数据源下面单独配置,也可抽出成公共配置
                    hikari:
                        maximum-pool-size: 100
                        minimum-idle: 20
                        data-source-properties:
                            cachePrepStmts: true
                            prepStmtCacheSize: 250
                            prepStmtCacheSqlLimit: 2048
                            useServerPrepStmts: true
            	  database2:
            	  ........
疑似坑点:碰到了多数据源依赖在mybatisplus核心依赖之后,多数据源依赖无法引入的问题(可能是个人环境问题)。

重要:mybatisplus官方并没有提供事务的实现

引入mybatisplus的多数据源配置后,无法使用spring的原生事务,强行使用@Transactional注解后会出现默认使用第一个数据源作为连接,此时,如果是查询非默认数据源数据,会报表不存在的异常。
网上的多数据源事务配置比较繁琐,这里实验了一种比较简单的多数据源事务配置
注:只支持单个数据源事务,多数据源之间的事务不支持

原因:使用@DS注解动态切换数据源之后spring自带事务并不知道有哪些数据源,那么解决也就从这里开始
第一步
//注入数据源给jta事务管理器,在使用spring原生事务注解时,指定事务管理器TransactionManager,由jta对多数据源进行管理(这里未尝试其他事务管理器,感兴趣的可以尝试一下)
    @Bean(name = "TransactionManager")
    @Primary
    @Order(2)
    public DataSourceTransactionManager TransactionManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
第二步
//在service层的方法上注解相应的事务和@DS
//这里有一个坑,如果@Transactional注解在service层,@DS注解到mapper上是不会起作用的,二者必须同时注解在service方法上,所以,在mapper上也要加,service的事务方法也要加,这样其他不需要事务的方法不会报错,事务方法也会生效。
    @Transactional(transactionManager = "TransactionManager")
    @DS("chddata")
    public void serviceMethod(){
    }
注:正如官网所说:强烈建议只在service的类和方法上添加注解,不建议在mapper上添加注解。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MybatisPlus 支持多数据配置,可以通过配置多个数据来实现对不同数据库的读写操作。下面是一个简单的多数据配置示例: 1. 配置多个数据 ```java @Configuration public class DataSourceConfig { @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource.ds1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.ds2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } } ``` 2. 配置 MybatisPlus数据和事务管理器 ```java @Configuration @MapperScan(basePackages = "com.example.mapper") public class MybatisPlusConfig { @Autowired @Qualifier("dataSource1") private DataSource dataSource1; @Autowired @Qualifier("dataSource2") private DataSource dataSource2; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dynamicDataSource()); return factoryBean.getObject(); } @Bean public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("dataSource1", dataSource1); dataSourceMap.put("dataSource2", dataSource2); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(dataSource1); return dynamicDataSource; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dynamicDataSource()); } } ``` 3. 配置数据的路由策略 ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } } ``` 4. 在需要切换数据的地方设置数据的 key ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSourceKey(String dataSourceKey) { contextHolder.set(dataSourceKey); } public static String getDataSourceKey() { return contextHolder.get(); } public static void clearDataSourceKey() { contextHolder.remove(); } } ``` 这样就可以在不同的操作中切换不同的数据了。例如: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsersFromDataSource1() { DataSourceContextHolder.setDataSourceKey("dataSource1"); return userMapper.selectAll(); } public List<User> getAllUsersFromDataSource2() { DataSourceContextHolder.setDataSourceKey("dataSource2"); return userMapper.selectAll(); } } ``` 以上是一个简单的 MybatisPlus数据配置示例,具体实现可以根据自己的业务需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值