sharding-jdbc多数据源配置

这篇具有很好参考价值的文章主要介绍了sharding-jdbc多数据源配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过sharding-jdbc做分表这里就不多做介绍了,需要的可以看上一片文章

当项目中配置了多数据源,并且其中一个数据源需要使用sharding-jdbc分表时,配置如下

  1. 导入shardingjdbc依赖

  <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.1</version>
 </dependency>

这里使用的是4.0.1的配置,和上篇的3.1.0差别不大,详细配置大伙可以上官网查阅。

  1. 多数据源配置类

shardingsphere数据源初始化

package com.efuav.parkingapron.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.shardingsphere.api.config.sharding.KeyGeneratorConfiguration;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

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

@Configuration
@MapperScan(basePackages = "com.efuav.parkingapron.dao.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSourceConfig1 {

    @Value("${spring.shardingsphere.datasource.efuavsystem.username}")
    private String userName;

    @Value("${spring.shardingsphere.datasource.efuavsystem.jdbc-url}")
    private String url;

    @Value("${spring.shardingsphere.datasource.efuavsystem.password}")
    private String userPwd;

    @Value("${spring.shardingsphere.datasource.names}")
    private String dataName;


//    @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)
//    @Bean(name="db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db1") //读取application.yml中的配置参数映射成为一个对象
//    public DataSource getDb1DataSource(){
//
//        return DataSourceBuilder.create().build();
//    }

    @Bean(name = "db1DataSource")
    @Qualifier("db1DataSource")
    public DataSource deviceDataSource() throws SQLException {
        return getShardingDataSource();
    }

    @Primary
    @Bean("db1SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
        return bean.getObject();
    }

    @Primary
    @Bean("db1SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }


    DataSource getShardingDataSource() throws SQLException {
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        // 配置分表规则
        shardingRuleConfig.getTableRuleConfigs().add(getRealTableRuleConfiguration());
        shardingRuleConfig.getBindingTableGroups().add("ef_uav_realtimedata");

        Properties props = new Properties();
        // 配置shardingsphere是否打印日志
        props.setProperty("sql.show", "true");
        // 创建数据源
        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, props);
    }

    // 返回ef_uav_realtimedata表的分表规则配置
    TableRuleConfiguration getRealTableRuleConfiguration() {
        // 指定数据库及表配置规则
        TableRuleConfiguration result = new TableRuleConfiguration("ef_uav_realtimedata", "efuavsystem.ef_uav_realtimedata$->{1..5}");
        // 指定分表字段及分表规则类  TaTable2Algorithm为自定义分表规则类
        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("uav_id", new UavPreciseShardingAlgorithm()));
        return result;
    }

    private Map<String, DataSource> createDataSourceMap() {
        Map<String, DataSource> result = new HashMap<>();
        HikariDataSource dbs = new HikariDataSource();
        dbs.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dbs.setJdbcUrl(url);
        dbs.setUsername(userName);
        dbs.setPassword(userPwd);
        result.put(dataName, dbs);
        return result;
    }
}

普通数据源初始化

package com.efuav.parkingapron.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.efuav.parkingapron.dao.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSourceConfig2 {

    @Bean("db2DataSource")
//    @ConfigurationProperties(prefix = "spring.datasource.db2")
    @ConfigurationProperties(prefix = "spring.datasource.infrared")
    public DataSource getDb1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean("db2SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
        return bean.getObject();
    }

    @Bean("db2SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
  1. 分表自定义配置规则(上篇文章有解释)

package com.efuav.parkingapron.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import javax.annotation.PostConstruct;
import java.util.Collection;
//分表规则
@Slf4j
public class UavPreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> {
    /**
     * 插入数据 改写表的名称
     * 查询 改写表的名称
     *
     * @param collection
     * @param preciseShardingValue
     * @return
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        //  UAV07JDE6E0020240
        String value = preciseShardingValue.getValue();
        int las = value.charAt(value.length() - 1);
        String tableName = "ef_uav_realtimedata" + ((las % 4)+1);
        log.info("<tableName{}>", tableName);
        return tableName;
    }
}

4.yml配置文件

spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    infrared:
      jdbc-url: jdbc:mysql://192.168.0.5:13306/infrared?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
      username: root  #用户名
      password: 123456 #密码
      driver-class-name: com.mysql.cj.jdbc.Driver  #数据库链接驱动
      type: com.zaxxer.hikari.HikariDataSource
    hikari.minimum-idle: 5
    hikari.maximum-pool-size: 15
    hikari.auto-commit: true
    hikari.idle-timeout: 30000
    hikari.pool-name: DatebookHikariCP
    # 不小于30s 否则会回到默认的1800秒, 用来设置一个connection在连接池中的存活时间,默认是1800000,即30分钟。如果设置为0,表示存活时间无限大。如果不等于0且小于30秒则会被重置回30分钟。
    hikari.max-lifetime: 28800000
    hikari.connection-timeout: 30000
    hikari.connection-test-query: SELECT 1
  shardingsphere:
    datasource:
      names: efuavsystem
      efuavsystem:
        jdbc-url: jdbc:mysql://127.0.0.1:3306/ef_uav_system?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
        username: root  #用户名
        password: 123456 #密码
        driver-class-name: com.mysql.cj.jdbc.Driver  #数据库链接驱动
        type: com.zaxxer.hikari.HikariDataSource
        # 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
#    sharding:
#      tables:
#        ef_uav_realtimedata:
#          actual-data-nodes: efuavsystem.ef_uav_realtimedata$->{1..5}
#          table-strategy:
#            standard:
#              precise-algorithm-class-name: com.efuav.parkingapron.config.UavPreciseShardingAlgorithm
#              sharding-column: uav_id
    # 打印执行的数据库
#    props:
#      sql:
#        show: true

这样就不会冲突,以上就是sharding-jdbc多数据源配置了。

记录....文章来源地址https://www.toymoban.com/news/detail-624651.html

到了这里,关于sharding-jdbc多数据源配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Sharding-JDBC分库连接数优化

    一、背景 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实例最少要增加

    2024年02月14日
    浏览(37)
  • 若依框架集成sharding-jdbc

    本文基于4.X版本开发 官方网站 定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spri

    2024年02月08日
    浏览(99)
  • springboot~sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(47)
  • Sharding-JDBC之PreciseShardingAlgorithm(精确分片算法)

      在我之前的文章里,数据的分库分表都是基于行表达式的方式来实现的,看起来也蛮好用,也挺简单的,但是有时会有些复杂的规则,可能使用行表达式策略会很复杂或者实现不了,我们就讲另外一种分片策略,精确分片算法,通常用来处理=或者in条件的情况比较多。

    2024年02月11日
    浏览(45)
  • springboot~对应sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(37)
  • springboot整合sharding-jdbc实现分库分表详解

    目录 一、为什么需要分库分表 1.1 分库分表的优势 二、分库分表基本概念 2.1 垂直分表

    2024年02月05日
    浏览(64)
  • Sharding-JDBC分库分表四种分片算法

    精确分片算法(PreciseShardingAlgorithm)精确分片算法(=与IN语句),用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用 范围分片算法(RangeShardingAlgorithm)用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景。需要配合StandardShardingS

    2024年02月10日
    浏览(40)
  • 【Spring Boot 3】【数据源】自定义JDBC多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月23日
    浏览(50)
  • 多数据源配置从库连接sqlserver报错,com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establis

    一开始我自己本地配置如下: 微软家的sqlserver驱动不好用,maven的驱动如下: 然后在本地网段一致的情况下测试是没有问题的,当部署线上环境启动服务时,加载数据源的时候,当加载到sqlserver的数据源的时候就开始异常了,异常信息如下: 网上有说修改JDK什么的解决: 这

    2024年02月11日
    浏览(49)
  • Spark SQL数据源:JDBC

    Spark SQL还可以使用JDBC API从其他关系型数据库读取数据,返回的结果仍然是一个DataFrame,可以很容易地在Spark SQL中处理,或者与其他数据源进行连接查询。 在使用JDBC连接数据库时可以指定相应的连接属性 属性 介绍 url 连接的JDBC URL driver JDBC驱动的类名 user 数据库用户名 pass

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包