mybatis plus+sharding+动态数据源启动报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

**

mybatis plus+sharding+动态数据源启动报错:Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required

**
百度Google搜了一大堆都说不能用 druid springboot启动器 ,但是我用的是HikariCP ,压根没有druid的包。
根据报错debug发现是缺少sqlSessionTemplate bean导致的这个问题。

sqlSessionTemplate的创建是在MybatisPlusAutoConfiguration中,仔细看了下MybatisPlusAutoConfiguration源码,
在这里插入图片描述
如图,只有在DataSource能够唯一确定下来才会加载这个配置,当我们配置了sharding和动态数据源的时候会创建两个各自的DataSource,导致这个config根本不会加载,同时sqlSessionTemplate也不会加载。

解决办法

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

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

/**
 * @author: xxx
 * @Date: 2021/9/7 14:36
 * @Description:
 */
@Configuration
@AutoConfigureBefore(DynamicDataSourceAutoConfiguration.class)
@AutoConfigureAfter(SpringBootConfiguration.class)
public class DataSourcesConfig {

    @Autowired
    private DynamicDataSourceProperties properties;

    @Autowired
    private DataSource shardingDataSource;


    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = new HashMap<>(2);
                dataSourceMap.put("sharding", shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    @Bean
    @Primary
    public DataSource dataSource() {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }


}

创建这样一个配置类,有两个作用:1.把sharding的DataSource交给动态数据源管理 2.把动态数据源的DataSource设置为主数据源,这样MybatisPlusAutoConfiguration就会加载了

最后,我用的动态数据源版本是

 		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

不同版本可能不太相同

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Sharding-JDBC 是一款基于 JDBC 的数据库中间件,用于将一个大型数据库表拆分成多个小表存储在不同的数据库中。Spring Boot 是一个非常流行的 Java 开发框架,它提供了很多方便的功能,比如自动配置、自动装配等,使得开发过程变得更加简单。 要在 Spring Boot 中整合 Sharding-JDBC,需要完成以下几个步骤: 1. 引入 Sharding-JDBC 的依赖 在 pom.xml 文件中添加 Sharding-JDBC 和对应的数据库驱动的依赖: ``` <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>${sharding-jdbc.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> ``` 2. 配置 Sharding-JDBC 的数据源 在 application.yml(或 application.properties)文件中配置 Sharding-JDBC 的数据源。这里以 MySQL 数据库为例: ``` spring: datasource: driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource username: root password: 123456 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false shardingsphere: datasource: names: ds0, ds1 ds0: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test0?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 ds1: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 sharding: tables: user_info: actualDataNodes: ds$->{0..1}.user_info$->{0..1} tableStrategy: standard: shardingColumn: id preciseAlgorithmClassName: io.shardingjdbc.core.api.algorithm.sharding.PreciseModuloShardingAlgorithm rangeAlgorithmClassName: io.shardingjdbc.core.api.algorithm.sharding.RangeModuloShardingAlgorithm ``` 其中,`datasource.names` 配置了数据源的名称,`datasource.ds0` 和 `datasource.ds1` 分别配置了两个数据库实例的连接信息。`sharding.tables` 配置了需要进行分片的表的信息,`actualDataNodes` 配置了分片后的数据节点,`tableStrategy` 配置了分片算法。 3. 配置 MyBatis 如果使用 MyBatis 作为 ORM 框架,需要在 MyBatis 的配置文件中配置 Sharding-JDBC 的插件和数据源: ``` <plugins> <plugin interceptor=&quot;io.shardingjdbc.spring.boot.masterslave.SpringBootMasterSlavePlugin&quot;/> </plugins> <environments default=&quot;master_slave&quot;> <environment id=&quot;master_slave&quot;> <transactionManager type=&quot;JDBC&quot;/> <dataSource type=&quot;com.alibaba.druid.pool.DruidDataSource&quot;> <property name=&quot;driverClassName&quot; value=&quot;${spring.datasource.driver-class-name}&quot;/> <property name=&quot;url&quot; value=&quot;${spring.datasource.url}&quot;/> <property name=&quot;username&quot; value=&quot;${spring.datasource.username}&quot;/> <property name=&quot;password&quot; value=&quot;${spring.datasource.password}&quot;/> </dataSource> </environment> </environments> ``` 4. 测试分片效果 完成以上步骤后,就可以启动应用程序并测试分片效果了。可以插入一些数据并进行查询,观察数据是否被正确地分配到了不同的数据库中。 以上是整合 Sharding-JDBC 到 Spring Boot 的基本步骤。当然,在实际应用中还需要根据具体业务需求进行更加详细的配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值