Sharding-jdbc使用干货

这里:

先来个分表:

引入配置文件:
依赖
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

配置文件:

server:
  port: 8888
spring:
  http:
    encoding:
      enabled: true
      charset: utf-8
      force: true
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names: m1
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
        username: root
        password: 123456
    sharding:
      tables:
        t_order:
          actualDataNodes: m1.t_order_$->{1..2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order_$->{order_id % 2 + 1}
          keyGenerator:
            type: SNOWFLAKE
            column: order_id
    props:
      sql:
        show: true
mybatis:
  type-aliases-package: com.evak.evakoams.model
  mapper-locations: classpath:/mybatis-mappers/*
  configuration:
    mapUnderscoreToCamelCase: true
  mvc:
    servlet:
      load-on-startup: 1
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
files:
  path: ${file-path:d:/files}
logging:
  level:
    root: info
    org.springframework.web: info
    com.itheima.dbsharding: debug
    druid.sql: debug

建表语句:

REATE TABLE `t_order_1` (
  `order_id` bigint(20) NOT NULL,
  `price` decimal(10,0) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `status` varchar(50) NOT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=u

在这里插入图片描述

测试mapper


    @Insert("insert into t_order(price,user_id,status)values(#{price},#{userId},#{status})")
    int insertOrder(@Param("price") BigDecimal price, @Param("userId")Long userId, @Param("status")String status);

插入数据测试类:

import java.math.BigDecimal;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {EvakOamsApplication.class})
public class test {
    @Autowired
    testmappper testmappper;

    @Test
    public void insert(){
        for (int i=1;i<15;i++){
            testmappper.insertOrder(new BigDecimal(1),12l,"success");
        }

    }
}

结果:
在这里插入图片描述

根据ID查询某几个数据:

sql拼接格式:


SELECT * FROM t_order_1 WHERE order_id IN(398789189610504192,398789190659080192)

在mybatis中拼接

/**
     * 根据id查询数据
     * @return
     */
    @Select("<script>" +
            "select" +
            " * " +
            " from t_order t " +
            " where t.order_id in " +
            " <foreach collection='orderIds' open='(' separator=',' close=')' item='id'>" +
            " #{id} " +
            " </foreach>" +
            "</script>")
    List<Map> selectOrderbyIds(@Param("orderIds")List<Long> orderIds);

写个测试:

 @Test
    public void testSelectOrderbyIds(){
        List<Long> ids=new ArrayList<>();
        ids.add(398789190659080192L);
        ids.add(398789189610504192L);
        List<Map> maps=testmappper.selectOrderbyIds(ids);
        System.out.println(maps);
    }

打印结果:
在这里插入图片描述

执行原理:
在这里插入图片描述

再来个分库:

sharding:
      #水平分库
      database-strategy:
        inline:
          shardingcolumn: Fenk_ID
          algorithm-expression: m$‐>{Fenk_ID % 2 + 1}

在这里插入图片描述

配置读写分离:

MySQL主从配置:

这里做了个伪分离 ,拷贝了一份

在这里插入图片描述
第一个是原始数据库
第二个是拷贝后数据库
接下来修改my.ini配置:

主要是修改三点:端口 安装目录 数据库的数据存放目录
修改端口:

# 设置mysql客户端连接服务端时默认使用的端口


port=3307


default-character-set= UTF8

配置安装路径:


# 设置mysql的安装目录


basedir=C:\Program Files\MySQL\mysql-8.0.13-winx64 - s1

配置数据存放位置:

# 设置mysql数据库的数据的存放目录


datadir=C:\Program Files\MySQL\data-s1
# 允许最大连接数

安装服务:

 mysqld install mysql-s1 --defaults-file="C:\Program Files\MySQL\mysql-8.0.13-winx64-s1\my.ini"
Service successfully installed.

在这里插入图片描述
安装成功之后可以在服务里面找到对应的服务:
刷新:
在这里插入图片描述

继续修改配置:

找到主数据库:*(注意是主数据库)

#开启日志 
log‐bin = mysql‐bin 
#设置服务id,主从不能一致 
server‐id = 1
#设置需要同步的数据库 xxx为要同步的数据库
binlog‐do‐db=xxx 
#屏蔽系统库同步 
binlog‐ignore‐db=mysql 
binlog‐ignore‐db=information_schema  
binlog‐ignore‐db=performance_schema

找到从数据库配置文件my.ini *(注意是从数据库)

#开启日志 
log‐bin = mysql‐bin 
#设置服务id,主从不能一致 
server‐id = 2 
#设置需要同步的数据库 xxx为数据库名字
replicate_wild_do_table=xxx.% 
#屏蔽系统库同步 
replicate_wild_ignore_table=mysql.% 
replicate_wild_ignore_table=information_schema.% 
replicate_wild_ignore_table=performance_schema.%

主从MySQL下的数据(data)目录下有个文件auto.cnf,文件中定义了uuid,要保证主从数据库实例的 uuid不一样,建议直接删除掉,重启服务后将会重新生成。

然后重新启动两个数据库:

在主数据库中

创建授权用户:


CREATE USER 'slave'@'localhost' IDENTIFIED BY '123456'

授权:

GRANT REPLICATION SLAVE ON *.* TO 'leven'@'localhost';

刷新:

flush privileges; 

查看当前用户状态:

SHOW MASTER STATUS

在这里插入图片描述
记住这个155的位置

在从数据库中
先停止同步

STOP SLAVE

CHANGE MASTER TO MASTER_HOST='localhost',
 MASTER_USER='Leven', 
 MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155;

启动同步:

START SLAVE;
STOP SLAVE

CHANGE MASTER TO MASTER_HOST='localhost',
 MASTER_USER='leven', 
 MASTER_PASSWORD='Leven',
 MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155;

START SLAVE;

SHOW SLAVE STATUS

在这里插入图片描述

完成

发布了76 篇原创文章 · 获赞 9 · 访问量 6760

猜你喜欢

转载自blog.csdn.net/qq_37870369/article/details/102930794