ShardingJdbc垂直分库及公共表

摘要:
前面已经介绍过,垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。接下来看一下如何使用Sharding-JDBC实现垂直分库。创建数据库创建数据库user_db的t_user表中CREATETABLE`t_user`ENGINE=InnoDBCHARACTERSET=utf8COLLATE=utf8_general_ciROW_FORMAT=Dynamic;修改配置信息server:port:56081servlet:context-path:/sharding-jdbc-simple-demospring:application:name:sharding-jdbc-simple-demohttp:encoding:enabled:truecharset:utf-8force:truemain:allow-bean-definition-overriding:trueshardingsphere:datasource:#新增一个m2库names:m2,m3,m1m1:type:com.alibaba.druid.pool.DruidDataSourcedriverClassName:com.mysql.jdbc.Driverurl:jdbc:mysql://rm-xxxxxx.mysql.rds.aliyuncs.com:3306/order_db_1?

前面已经介绍过,垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器
上,它的核心理念是专库专用。接下来看一下如何使用Sharding-JDBC实现垂直分库。
(1)创建数据库
创建数据库user_db 的t_user表中

CREATE TABLE`t_user`(
`user_id` bigint(20)NOT NULL COMMENT '用户id',
`fullname` varchar(255)CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户姓名',
`user_type` char(1) DEFAULT NULL COMMENT'用户类型',
PRIMARY KEY(`user_id`) USING BTREE
)ENGINE=InnoDB CHARACTER SET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=Dynamic;

修改配置信息

server:
  port: 56081servlet:
    context-path: /sharding-jdbc-simple-demo
spring:
  application:
    name: sharding-jdbc-simple-demo
  http:
    encoding:
      enabled: true
      charset: utf-8force: true
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      #新增一个m2库
      names: m2,m3,m1
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://rm-xxxxxx.mysql.rds.aliyuncs.com:3306/order_db_1?useUnicode=true
        username: root
        password: 123456m2:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://rm-xxxxxxxxx.mysql.rds.aliyuncs.com:3306/order_db_2?useUnicode=true
        username: root
        password: 123456m3:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://rm-xxxxxxx.mysql.rds.aliyuncs.com:3306/user_db?useUnicode=true
        username: root
        password: 123456sharding:
      tables:
        t_order:
          # 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。
          databaseStrategy:
            inline:
              shardingColumn: user_idalgorithmExpression: m$->{user_id % 2 + 1}
          # 指定t_order表的数据分布情况,配置数据节点
          actualDataNodes: m$->{1..2}.t_order_$->{1..2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order_$->{order_id % 2 + 1}
          # 指定t_order表的分片策略,分片策略包括分片键和分片算法
          keyGenerator:
            type: SNOWFLAKE
            column: order_id
        t_user:
          # 指定t_user表的数据分布情况,配置数据节点
          actualDataNodes: m3.t_user
          tableStrategy:
            inline:
              shardingColumn: user_idalgorithmExpression: t_user
      broadcast-tables: t_dict
    props:
      sql:
        show: true
mybatis:
  configuration:
    map-underscore-to-camel-case: true
swagger:
  enable: true
logging:
  level:
    root: info
    org.springframework.web: info
    com.topcheer.dbsharding: debug
    druid.sql: debug

ShardingJdbc垂直分库及公共表第1张

/*** Created by Administrator.
 */@Mapper
@Component
public interfaceUserDao {

    /*** 新增用户
     * @paramuserId 用户id
     * @paramfullname 用户姓名
     * @return
     */@Insert("insert into t_user(user_id, fullname) value(#{userId},#{fullname})")
    int insertUser(@Param("userId") Long userId, @Param("fullname") String fullname);

    /*** 根据id列表查询多个用户
     * @paramuserIds 用户id列表
     * @return
     */@Select({"<script>",
            " select",
            " * ",
            " from t_user t ",
            " where t.user_id in",
            "<foreach collection='userIds' item='id' open='(' separator=',' close=')'>",
            "#{id}",
            "</foreach>",
            "</script>"})
    List<Map> selectUserbyIds(@Param("userIds") List<Long>userIds);

    /*** 根据id列表查询多个用户
     * @paramuserIds 用户id列表
     * @return
     */@Select({"<script>",
            " select",
            " * ",
            " from t_user t ,t_dict b",
            " where t.user_type = b.code and t.user_id in",
            "<foreach collection='userIds' item='id' open='(' separator=',' close=')'>",
            "#{id}",
            "</foreach>",
            "</script>"})
    List<Map> selectUserInfobyIds(@Param("userIds") List<Long>userIds);
}

测试插入方法

@Test
    public voidtestInsertUser(){
        for (int i = 10 ; i<14; i++){
            Long id = i + 1L;
            userDao.insertUser(id,"姓名"+id );
        }

    }

ShardingJdbc垂直分库及公共表第2张

测试查询方法:

@Test
    public voidtestSelectUserbyIds(){
        List<Long> userIds = new ArrayList<>();
        userIds.add(1L);
        userIds.add(2L);
        List<Map> users =userDao.selectUserbyIds(userIds);
        System.out.println(users);
    }

ShardingJdbc垂直分库及公共表第3张

公共表
公共表属于系统中数据量较小,变动少,而且属于高频联合查询的依赖表。参数表、数据字典表等属于此类型。可
以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。接下来看一下如何使用
Sharding-JDBC实现公共表。
(1)创建数据库
分别在user_dborder_db_1order_db_2中创建t_dict表:

CREATE TABLE `t_dict`(
`dict_id` bigint(20) NOT NULL COMMENT '字典id',
`type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典类型',
`code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典编码',
`value` varchar(50)CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',
PRIMARY KEY(`dict_id`) USING BTREE
)ENGINE=InnoDB CHARACTER SET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=Dynamic;
@Mapper
@Component
public interfaceDictDao {

    /*** 新增字典
     * @paramtype 字典类型
     * @paramcode 字典编码
     * @paramvalue 字典值
     * @return
     */@Insert("insert into t_dict(dict_id,type,code,value) value(#{dictId},#{type},#{code},#{value})")
    int insertDict(@Param("dictId") Long dictId, @Param("type") String type, @Param("code") String code, @Param("value") String value);

    /*** 删除字典
     * @paramdictId 字典id
     * @return
     */@Delete("delete from t_dict where dict_id = #{dictId}")
    int deleteDict(@Param("dictId") Long dictId);

}

测试方法:

@Test
    public voidtestInsertDict(){
        dictDao.insertDict(3L,"user_type","2","超级管理员");
        dictDao.insertDict(4L,"user_type","3","二级管理员");
    }

ShardingJdbc垂直分库及公共表第4张

测试删除

@Test
    public voidtestDeleteDict(){
        dictDao.deleteDict(3L);
        dictDao.deleteDict(4L);
    }

ShardingJdbc垂直分库及公共表第5张

测试关联:

@Test
    public voidtestSelectUserInfobyIds(){
        List<Long> userIds = new ArrayList<>();
        userIds.add(1L);
        userIds.add(2L);
        List<Map> users =userDao.selectUserInfobyIds(userIds);
        System.out.println(users);
    }

ShardingJdbc垂直分库及公共表第6张

补充:

假如有些表没有分库也没有分表,而且有很多的话,应该怎么配置,就开始测试了一下。

在随便的一个库中建了一个表,没有指定节点,也没有配置别的信息,运行接口直接报错,说不到表。

个人猜想是不是和前面的库的配置顺序有关系,把表所在的库放在最后面,最后即可查询成功。

ShardingJdbc垂直分库及公共表第7张

免责声明:文章转载自《ShardingJdbc垂直分库及公共表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flask 中的模板语法 jinja2及render_template的深度用法svn的应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux和windows双系统互拷文件乱码问题

http://blog.chinaunix.net/u2/80678/showart_2043323.html   如果你需要在linux下面用到windows下的文件,拷贝上去后经常发现中文显示乱码。。原因是Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。比较繁琐的方法是在windows下用程序把内容转换为utf...

采用UTF8格式导出Excel存在乱码解决方法

目前我们开发Excel导出时,多数使用ExportToExcelCommon类导出Excel,通常情况下不会产生乱码,但在某些时候还是会产生乱码。解决方法很简单,只需要在ExportToExcel()方法中多加一句代码即可,ExportToExcel()方法如下: stringfileName; HttpContext.Curre...

Could not obtain connection to query metadata : An attempt by a client to checkout a Connection has timed out.]

hibernate c3p0配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-in...

解决txt乱码:将windows新建txt转换成utf-8格式

场景:产品将版本发布说明发给配置管理员(我自己),我使用jenkins建的任务自动传这个版本发布说明文件(release_note.txt)到ftp以后,打开文件后发现乱码。 调试: 但是将文件另存为utf-8格式再传上去,就不会乱码。 解决:需要将文件自动转化成utf-8在传,可以使用iconv来转换,由于我的系统上安装了gitbash, 我发现这个命令...

mybatis批量新增报错 BadSqlGrammarException

org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL synta...

CentOS7安装openjdk、tomcat和mysql流程介绍

首先是前戏,推荐一个远程工具Xshell和Xftp搭配使用,以下是Xshell的官网 http://www.netsarang.com/products/xsh_overview.html 1.openjdk How to download and install prebuilt OpenJDK packages JDK 8 Debian, Ubu...