历史潮流浩浩荡荡,顺之则昌,逆之则亡。——孙中山

基于ShardingShphere-JDBC实现读写分离

JAVA 徐 承恩 347℃

基于ShardingShphere-JDBC读写分离的样版工程。通过该工程快速了解ShardingShphere-JDBC框架。

Github地址

项目框架

Spring Boot

Mybatis

tkMapper

PageHelper

HikariCP

MySQL

knife4j

ShardingShphere-JDBC

基础设施搭建

MySQL数据库一个master节点一个slave节点均部署在Docker容器中,服务器使用CentOS7

安装Docker

启动Docker服务

创建Docker macvlan网络

举个例子

部署MySQL Master节点

$PWD参数表示你当前命令行所处的路径,那我们cd到Docker的volumes路径下,来部署我们的master节点。

配置MySQL Master节点

进入$PWD/mysql_01/conf目录,创建或修改my.cnf文件。

部署MySQL Slave节点

$PWD参数表示你当前命令行所处的路径,那我们cd到Docker的volumes路径下,来部署我们的slave节点。

配置MySQL Slave节点

进入$PWD/mysql_02/conf目录,创建或修改my.cnf文件。

配置主从复制

使用mysql命令行工具连接master节点

查看当前master节点状态信息

master节点状态信息回显

使用mysql命令行工具连接slave节点

配置主从复制命令

  • master_log_filemaster节点回显信息中的File列的值。
  • master_log_posmaster节点回显信息中的Position列的值。

启动主从复制命令

查看当前slave节点状态信息

slave节点状态信息回显

关于SharindShphere-JDBC框架主键回显报错问题

本项目数据访问层使用tkMapper框架,主键自增在字段上使用@GeneratedValue(generator = "JDBC")注解, 当调用tkMapper自带的insertSelective方法会导致空指针异常。

异常堆栈

异常分析

当我们调用tkMapper框架自带的insertSelective方法时生成的SQL语句如下:

PreparedStatement绑定参数如下:

tkMapper框架对insertSelective方法的官方解释:

保存一个实体,null的属性不会保存,会使用数据库默认值,无默认值则使用null

问题就出在这里,自增主键的null会当作绑定参数传递。ShardingShphere框架在底层处理时将该null值作为插入的主键值暂存, 执行回填逻辑时将该值作为可回填主键的值最终导致了异常。

重点关注的方法

转载请注明:思码老徐 » 基于ShardingShphere-JDBC实现读写分离

喜欢 (9)