首页 > 其他分享 >使用Sharding-JDBC 分库分表

使用Sharding-JDBC 分库分表

时间:2023-10-07 21:01:06浏览次数:35  
标签:11 分库 int bean JDBC user Sharding NULL id

当mysql单表数据量比较大时往往需要分库分表,Sharding-JDBC是当当网开源的数据库分库分表中间件。Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。本文主要讲述该框架与spring+mybatis的整合使用。

1.准备工作#

由于是分库分表,所以需要在不同的数据库建立相同的表。分别在sharding_0,sharding_1两个数据库中建立t_user0,t_user1,t_user2三张表,需要用到的SQL语句如下:

Copy

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `t_user_0`;
CREATE TABLE `t_user_0` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `t_user_1`;
CREATE TABLE `t_user_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `t_user_2`;
CREATE TABLE `t_user_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目的整体结构如下图所示:

需要用到的sharding-jdbc的依赖如下所示:

Copy

<dependency> <groupId>io.shardingjdbcgroupId> <artifactId>sharding-jdbc-coreartifactId> <version>${latest.release.version}version> dependency>

2.代码详解#

代码结构如上图所示,Mapper,Service层和普通的SSM项目一样,无需做改变,主要是增加了algorithm下面的两个文件,一个是分库策略,一个是分表策略。然后spring的配置文件稍稍做了修改,spring-database.xml设置的是数据库的连接信息。spring-sharding.xml设置的是具体的分库分表信息。

spring-database.xml配置如下所示:

Copy

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="locations">            <list>                <value>classpath:config/resource/jdbc_dev.propertiesvalue>            list>        property>    bean>        
    <bean name="sharding_0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">        <property name="url" value="${jdbc_url0}" />        <property name="username" value="${jdbc_username0}" />        <property name="password" value="${jdbc_password0}" />

        
        <property name="initialSize" value="0" />        
        <property name="maxActive" value="20" />        
        <property name="minIdle" value="0" />        
        <property name="maxWait" value="60000" />        <property name="validationQuery" value="${validationQuery}" />        <property name="testOnBorrow" value="false" />        <property name="testOnReturn" value="false" />        <property name="testWhileIdle" value="true" />        
        <property name="timeBetweenEvictionRunsMillis" value="60000" />        
        <property name="minEvictableIdleTimeMillis" value="25200000" />        
        <property name="removeAbandoned" value="true" />        
        <property name="removeAbandonedTimeout" value="1800" />        
        <property name="logAbandoned" value="true" />        <property name="filters" value="stat" />    bean>    
    <bean name="sharding_1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">        <property name="url" value="${jdbc_url1}" />        <property name="username" value="${jdbc_username1}" />        <property name="password" value="${jdbc_password1}" />

        
        <property name="initialSize" value="0" />        
        <property name="maxActive" value="20" />        
        <property name="minIdle" value="0" />        
        <property name="maxWait" value="60000" />        <property name="validationQuery" value="${validationQuery}" />        <property name="testOnBorrow" value="false" />        <property name="testOnReturn" value="false" />        <property name="testWhileIdle" value="true" />        
        <property name="timeBetweenEvictionRunsMillis" value="60000" />        
        <property name="minEvictableIdleTimeMillis" value="25200000" />        
        <property name="removeAbandoned" value="true" />        
        <property name="removeAbandonedTimeout" value="1800" />        
        <property name="logAbandoned" value="true" />        <property name="filters" value="stat" />    bean>

spring-sharding.xml配置如下所示,从下图中可以看到主要是指定了需要分表的策略和分库的策略,然后进行了封装,具体的分库分表策略需要自己编写。

Copy


    <bean id="dataSourceRule" class="com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule">        <constructor-arg>            <map>                <entry key="sharding_0" value-ref="sharding_0"/>                <entry key="sharding_1" value-ref="sharding_1"/>            map>        constructor-arg>    bean>    
    
    <bean id="userTableRule" class="com.dangdang.ddframe.rdb.sharding.api.rule.TableRule">        <constructor-arg value="t_user" index="0"/>        <constructor-arg index="1">            <list>                <value>t_user_0value>                <value>t_user_1value>                <value>t_user_2value>            list>        constructor-arg>        <constructor-arg index="2" ref="dataSourceRule"/>        <constructor-arg index="3" ref="userDatabaseShardingStrategy"/>        <constructor-arg index="4" ref="userTableShardingStrategy"/>    bean>    
    
    <bean id="userDatabaseShardingStrategy" class="com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy">        <constructor-arg index="0" value="user_id"/>        <constructor-arg index="1">            <bean class="com.study.dangdang.sharding.jdbc.algorithm.UserSingleKeyDatabaseShardingAlgorithm" />        constructor-arg>    bean>    
    
    <bean id="userTableShardingStrategy" class="com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy">        <constructor-arg index="0" value="user_id"/>        <constructor-arg index="1">            <bean class="com.study.dangdang.sharding.jdbc.algorithm.UserSingleKeyTableShardingAlgorithm" />        constructor-arg>    bean>    
    
    <bean id="shardingRule" class="com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule">        <constructor-arg index="0" ref="dataSourceRule"/>        <constructor-arg index="1">            <list>                <ref bean="userTableRule"/>            list>        constructor-arg>    bean>    
    
    <bean id="shardingDataSource" class="com.dangdang.ddframe.rdb.sharding.api.ShardingDataSource">        <constructor-arg ref="shardingRule"/>    bean>

标签:11,分库,int,bean,JDBC,user,Sharding,NULL,id
From: https://blog.51cto.com/u_16274468/7742629

相关文章

  • springboot -- 整合 sharding-jdbc 读写分离+分库分表配置(进阶)
    sharding-jdbc说明:1、分库分表不能中途更改,取模算法的id会出错2、不支持特殊sql,包括去重,子sql,聚合等3、查询会给所有表发查询sql,带上分库,分表的字段的查询只发一条,4、查询数据要注意使用,尽量带上分库或分表字段来查询,避免多表查询sql过多取模算法假设2个表,test_0,test_1,分......
  • jdbc-批量插入mssql数据库-原
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest2{//staticintcount=......
  • jdbc-批量插入百万数据-5秒
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.sql.Statement;importorg.junit.Test;publicclassAPP1{publicstaticvoidmain(String......
  • java——mysql随笔——运维——分库分表&MyCat
    分库分表:                    介绍:                    拆分方式:                                     ......
  • Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-
    JDBC概述JDBC(JavaDatabaseConnectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一......
  • JDBCTemplate 的简单使用
    什么是JDBCTemplateSpring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作使用JDBCTemplate1.在xml文件中配置 JdbcTemplate 对象,注入 DataSource(即数据库、数据源)<context:component-scanbase-package="transaction"/><beanid="dataSource"......
  • Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock
    153392398 RUNNING 2023-08-2309:10:09 6 397413 0 2 4 1136 2 2 0 REPEATABLEREAD 1 1 0 0 0 0 328854561014064 RUNNING 2023-08-2309:19:03 0 397493 0 0 0 1136 0 0 0 REPEATABLEREAD 1 1 0 0 0 0 328854560997800 RUNNING 2023-08-2309:06:41 0 39733......
  • Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: java.n
    今天发现连接beeline是时候连接不上,不应该啊昨晚还可以的qaq  破案了,我启动了metastore之后忘记去启动hiveserver2hiveserver2都没启动能连上就怪了 一定一定要记得启动顺序!!!hadoop+metastore+hiveserver2+beeline ......
  • 漏洞修复系列-如何升级linux系统Upgrade to PostgreSQL JDBC Driver version 42.2.27,
    问题遇到一个PostgreSQLJDBCDriver漏洞PostgreSQLJDBCDriverthatis42.2.xpriorto42.2.27,42.3.xpriorto42.3.8,42.4.xpriorto42.4.3or42.5.xpriorto42.5.1.Itis,therefore,affectedbyaninformationdisclosurevulnerability.原因PostgreSQLJD......
  • 【Java】JDBC 获取数据库表名、字段名、注释 Comment 等信息
    需求:给定数据库信息和表名,扫描表的字段名、字段类型和注释。要使用JavaJDBC获取数据库表名、字段名和注释信息,你需要连接到数据库并执行适当的SQL查询。以下是一些示例代码,展示如何获取这些信息。请注意,这些示例代码假定你已经建立了数据库连接。你需要根据你的数据库类型和连接......