这里:
先来个分表:
引入配置文件:
依赖
<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
完成