首页 > 其他分享 >使用sharding-jdbc做分库分表记录

使用sharding-jdbc做分库分表记录

时间:2024-06-03 09:54:30浏览次数:24  
标签:jdbc url 数据源 分表 分库 master sharding com

      项目中要使用分库分表来解决上亿数据的存储以及查询问题,最开始使用的是硬编码的方式,根据用户id的hash值做分表,保证同一个用户落在一张表里面。后面有同事说 使用shardingsphere有现成的解决方案,于是转成了使用shardingsphere。

 首先引入shardingjdbc的pom依赖

  

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

版本比较低,主要是其他项目使用的是这个版本。

yaml配置:

   

server:
  port: 8166
   
spring:
   #多数据源 uc以及community 仅仅适用于数据同步脚本
  datasource:
    dynamic:
      #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
      strict: true  
      primary: super_community
      datasource:
        orapickup_uc:
          url: url
          username: username
          password: password
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource        
        super_community:
          url: url_1
          username: username1
          password: password1
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource        
        orapickup_community:
          url: url2
          username: username2
          password: password2
          driver-class-name: com.mysql.jdbc.Driver  
          type: com.alibaba.druid.pool.DruidDataSource        
  # 配置Sharding-JDBC读写分离规则
  shardingsphere:
    # 指定数据源
    dataSource:
      names:
        master,slave  # 一主一从
      # 配置主库数据源
      master: # 必须跟上面names对应
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url:  url_master
        username: username_master
        password: password_master
      # 配置从库数据源
      slave: # 必须跟上面names对应
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: url_read
        username: username_read
        password: password_read
    props:
      sql:
        show: true  # 开启SQL显示,默认false
    sharding:
        # 默认数据源
        default-data-source-name: master
        #读写分离 注意 分库分表的读写分离和非分库分表读写分离不同
        master-slave-rules:                 # 在使用数据分片功能情况下,配置读写分离功能
          master:                              # 自定义一个虚拟数据源名字,用于自动路由下方主从数据源
            masterDataSourceName: master    # 指定主数据源
            slaveDataSourceNames: slave       # 指定从数据源
            loadBalanceAlgorithmType: round_robin
        tables:
          bbs_collect:
           #收藏表根据用户id分100张表
            actualDataNodes: master.bbs_collect_$->{1..100}
            tableStrategy:
                inline:
                  shardingColumn: create_by
                  #shardingColumn: is_enable
                  #分表规则:createBy hash后取模
                  algorithmExpression: bbs_collect_$->{Math.abs(create_by.hashCode())%100 + 1} 
          bbs_like:
            #真实表#分100张表
            actualDataNodes: master.bbs_like_$->{1..100}
            tableStrategy:
                inline:
                  shardingColumn: create_by
                  #shardingColumn: is_enable
                  #分表规则:createBy hash后取模
                  algorithmExpression: bbs_like_$->{Math.abs(create_by.hashCode())%100 + 1} 
                 
  application:
    name: gwm-community-interactive-server
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  servlet:
    multipart:
      maxFileSize: 5MB
      maxRequestSize: 500MB

gwm:
  mq:
    topics:
      bbsLikeTopics: bbslike-dev
  

rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: marketing-interactive-dev

      

    中间遇到的几个问题,首先是 分库分表和读写分离的配置问题。由于另外一个项目使用的是读写分离+多数据源,我使用了他们的那个配置,发现不行。分库分表和读写分离共用的话,需要另外配置。参考:

https://blog.csdn.net/qq_33763772/article/details/137401086

第二个是 当项目使用了事务的时候,分库分表会不生效。类似下面的格式会导致分库分表失效

@Service("bbsCollectServiceImpl")
@Transactional(propagation= Propagation.REQUIRED,rollbackFor = Exception.class) todo 使用事务会导致数据源切换失效
public class BbsCollectServiceImpl implements BbsCollectService {
  //
}

 

标签:jdbc,url,数据源,分表,分库,master,sharding,com
From: https://www.cnblogs.com/thinkingandworkinghard/p/18228189

相关文章

  • Java的JDBC编程
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库关注博主带你了解更多数据结构知识1.Java的数据库编程:JDBC数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需......
  • JDBC详解
    文章目录JDBC概述原生jdbc操作数据库流程PreparedStatement和Statement什么是JDBC连接,在Java中如何创建一个JDBC连接jdbc详解JDBC的事务管理是什么,为什么需要它JDBC的DataSource是什么,有什么好处?常见的JDBC异常有哪些什么是JDBC的最佳实践JDBC概述JDBC(JavaDataba......
  • 为 Spring Boot 2.6.2 JdbcTemplate 添加新数据源
    我有一个现有的SpringBoot2.6.2微服务,我们希望将调用添加到一个新的数据源。该服务将部署到使用Java8的Openliberty23.0.0.10。我创建了一个新的DAO:publicclassiSeriesDatabaseDao{@AutowiredprivateJdbcTemplatejdbcTemplate;publicStr......
  • 基于JAVA GUI的JDBC连接数据库
     要在JavaGUI中连接数据库,需要执行以下几个步骤:导入必要的包。你需要导入Java数据库连接相关的包,例如java.sql和javax.sql。与数据库连接相关的类和接口。  (1)DriverManger类。DriverManager类用于加载JDBD驱动并且创建其与数据库的连接。在DriverManager类中定义了......
  • MySQL 数据库-JDBC
    1.事务事务(Transaction):要么都成功,要么都失败事务原则:ACID原则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))原子性:要么都成功,要么都失败一致性:事务前后的数据完整性要保证一致(如,转账操作后,两个人的总额不变)持久性:事务一旦提交不可逆,被持久化到了......
  • 19.JDBC
    JDBCJava数据库连接(JavaDataBaseConnectivity)概念:Java数据库连接(JavaDataBaseConnectivity)规定了数据库厂商和Java连接的一些规则(接口),将来数据库厂商如果想编写程序连接到Java,必须要遵守指定的规则,需要实现规定的接口。程序员使用的时候,需要使用数据库厂商提供的jar......
  • JDBC & 数据库连接池:详述Java 数据库操作的基础,数据库连接池的使用以及原理,比较常用数
    JDBC基础 JDBC的定义和目的 JDBC(JavaDatabaseConnectivity)是一个用于执行SQL语句的JavaAPI,可以与多种关系数据库进行交互,这的API由一组用Java语言编写的类和接口组成。 JDBC鼓励供应商使用JDBC驱动程序,该驱动程序可以通过数据库管理系统的客户机接口与各个数......
  • javaSwing+JDBC+mysql校园跑管理项目(附源码下载)
    1.数据准备DELETEFROMstudents;Deletefromrunning;INSERTINTOstudents(student_id,name,age,major,grade)VALUES(1,'王小明',20,'计算机科学与技术','男'),(2,'张小红',21,'软件工程','女'),(3......
  • 高性能轻量级针对分表分库读写分离的解决方案
    efcore如何优雅的实现按年分库按月分表 efcore如何优雅的实现按年分库按月分表介绍本文ShardinfCore版本本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵适配距离上次发文.net相关的已经有很......
  • springboot3.0+shardingsphere5.2 最简单的分库分表
    先看表结构两个数据库test1,test2每个库有4张sys_user表分别命名sys_user_0-4maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>......