11 springboot集成sharding-jdbc分表

这里只考虑分表情况

创建maven项目,pom中引入jar包

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <!-- aigorithm jdbc -->
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>sharding-jdbc-core</artifactId>
        <version>1.5.3</version>
    </dependency>
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>sharding-jdbc-config-yaml</artifactId>
        <version>1.5.3</version>
    </dependency>

    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

创建表,我这里就简单的创建了两个表user0user1

CREATE TABLE user0 (
id bigint(64) NOT NULL,
name varchar(255) default NULL,
sex int(1) default NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

user1结构和user0一样,就是表名换了

这个是项目结构


项目结构

主要看sharding.ymlShardingConfig

sharding.yml

dataSource:
  ds_0: !!com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://172.16.255.69:3306/test
    driverClassName: com.mysql.jdbc.Driver
    username: root
    password: root

tables:
  user:
    actualTables: user${0..1}
    tableStrategy:
      shardingColumns: id
      algorithmExpression: user${id.longValue() % 2}

bindingTables:
  - tableNames: user

#默认数据库分片策略
defaultDatabaseStrategy:
  shardingColumns: id
  algorithmExpression: ds_0

props:
  sql.show: true

ShardingConfig

import com.dangdang.ddframe.rdb.sharding.config.yaml.api.YamlShardingDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.io.File;

@Configuration
public class ShardingConfig {
    @Bean
    public DataSource dataSource() throws Exception {
        Resource resource = new ClassPathResource("sharding.yml");
        File file = resource.getFile();
        DataSource dataSource = new YamlShardingDataSource(file);
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource());
    }
}

主要操作在UserMapper中

UserMapper

注意:这里的表名没有后缀0,1等,主要在sharding.yml中配置。

然后启动application。正确



这两个数据在两个表中,插入也一样,id为奇数插入到user1中,id为偶数插入到user0

那么问题来了,sharding-jdbc原理是什么。http://blog.csdn.net/u4110122855/article/details/50670503,下回有时间要好好看看他们的代码。

代码放在 https://github.com/lijiaccy/springboot-sharding-table

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录;(一) 拆分实施策略和示例演示(二) 全局主键生成策略(三) 关于使用框架还是自主开发以及sharding实...
    linking12阅读 10,502评论 1 52
  • 一,先说一下为什么要分表当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在...
    MrKai平凡之路阅读 877评论 1 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,259评论 19 139
  • 大半夜 脑子异常的清醒 男女情爱 你情我愿 也不懂 本是如此 又何必算它斤两 许是习惯了理科简单的演练推算 不愿想...
    Tina杨杨杨阅读 250评论 0 0