写在前面
Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但Mysql的主从复制需要我们通过其它方式实现。这里假设我们已经搭建好相关的环境,下面就开始我们的实践吧!
准备环境
Mysql(Version : 5.7)主从环境搭建
对应数据库建立(以下例子中要建的数据库是:master1mycat 和 master2mycat)
配置server.xml
mysqlmycat
mysqlmycats
配置schema.xml
select user()
select user()
配置rule.xml
id
mod-long
user_id
mod-long
2
修改了配置文件后,别忘了重启Mycat,如果有异常出现,请通过查看logs目录下的日志文件进行排查。
项目搭建(SpringBoot + JPA)
准备:首次建表,设置application.yml中的spring.jpa.hibernate.ddl-auto属性为:create(JPA自动建表解决方案,使用update的话在连接mycat的时候会报找不到表的错误)。为保证数据不被丢失,在建表之后可以更改为:update
添加application.yml:
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: update
naming:
strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
datasource:
url: jdbc:mysql://localhost:8066/mysqlmycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true
username: mysqlmycat
password: mysqlmycat
添加User Entity
@Entity
@Table(name = "tb_user")
@Data
public class User {
@Id
private Long id;
private String name;
private Integer gender;
}
添加Student Entity
@Entity
@Table(name = "tb_student")
@Data
public class Student {
@Id
private Long id;
private String name;
@Column(unique = true)
private Long userId;
}
添加UserDao
public interface UserDao extends JpaRepository {
Page findByNameLike(String name, Pageable pageable);
}
添加StudentDao
public interface StudentDao extends JpaRepository {
Page findByNameLike(String name, Pageable pageable);
}
项目测试
测试添加
@Test
public void testAdd() {
for (long i = 0; i < 30; i++) {
User user = new User();
user.setId(i);
user.setName("张三" + i);
user.setGender(i % 2 == 0 ? 0 : 1);
userDao.save(user);
Student student = new Student();
student.setId(System.currentTimeMillis() + i);
student.setName("张三学生" + i);
student.setUserId(i);
studentDao.save(student);
}
}
测试结果:数据按id取模的方式划分到了两个数据库中,同时从库同步了主库的数据
水平切分(id取模)
测试模糊查询+分页
@Test
public void testFind() {
Pageable pageable = new PageRequest(0, 10, Sort.Direction.DESC, "id");
List userList = userDao.findByNameLike("%张三2%", pageable).getContent();
userList.forEach(System.out::println);
Pageable pageable2 = new PageRequest(0, 10, Sort.Direction.DESC, "userId");
List studentList = studentDao.findByNameLike("%张三学生1%", pageable2).getContent();
studentList.forEach(System.out::println);
}
测试结果:按照模糊匹配及id降序的方式输出结果
测试模糊查询+分页
测试结果:读操作都走了从库
读写分离,读都走了从库
删除及修改请自行测试
参考链接