写在前面

  Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。这里假设我们已经搭建好相关的环境,下面就开始我们的实践吧!

  准备环境

  PostgreSQL(Version : 10.1)主从环境搭建对应数据库建立(以下例子中使用的都是默认存在的postgres数据库,可以不用额外添加)

  配置server.xml

  

  postgresmycat

  postgresmycats

  

  配置schema.xml

  

  

  

  

  

  

  

  

  select user

  

  

  

  

  

  select user

  

  

  

  

  dbDriver 属性

  指定连接后端数据库使用的 Driver,目前可选的值有 native 和 jdbc。使用 native 的话,因为这个值执行的

  是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持

  引述《Mycat权威指南》里面的原话:

  从 1.6 版本开始支持 postgresql 的 native 原始协议。

  如果使用 JDBC 的话需要将符合 JDBC4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中

  包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:

  com.mysql.jdbc.Driver。

  所以,具体的解决方案就是找一个postgresql的jar包,然后丢到mycat的lib目录下,不然就会出现启动失败或者连接不到postgre数据库的异常情况。本例中用到的jar包是:postgresql-42.1.4.jar

  配置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的时候会报找不到表的错误)。之后似乎必须更改为:none,否则使用其它属性都会报错(这里Mysql与PostgreSQL不同,似乎是一个未解决的bug,这也就意味着以后新增字段都要手动连上数据库进行添加了...)添加application.yml(注意了,这里都是用连mysql的方式去配置,Mycat会在后端做好对其它数据库的连接):

  spring:

  jpa:

  show-sql: true

  hibernate:

  ddl-auto: update

  naming:

  strategy: org.hibernate.cfgprovedNamingStrategy

  properties:

  hibernate:

  dialect: org.hibernate.dialect.MySQL5Dialect

  datasource:

  url: jdbc:mysql://localhost:8066/postgresmycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true

  username: postgresmycat

  password: postgresmycat

  添加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 ? 1 : 0);

  userDao.save(user);

  Student student=new Student();

  student.setId(System.currentTimeMillis() + i);

  student.setName("李四学生" + i);

  student.setUserId(i);

  studentDao.save(student);

  }

  }

  测试结果:数据按id取模的方式划分到了游戏账号两个数据库中,同时从库同步了主库的数据

  测试模糊查询+分页

  @Test

  public void testFind() {

  Pageable pageable=new PageRequest(0, 10, Sort.Direction.ASC, "id");

  List userList=userDao.findByNameLike("%李四1%", pageable).getContent();

  userList.forEach(System.out::println);

  Pageable pageable2=new PageRequest(0, 10, Sort.Direction.ASC, "userId");

  List studentList=studentDao.findByNameLike("%李四学生2%", pageable2).getContent();

  studentList.forEach(System.out::println);

  }

  测试结果:按照模糊匹配及id升序的方式输出结果

  测试结果:读操作都走了从库

  删除及修改请自行测试

更多相关文章

  1. MySQL 线上数据库清理数据的方法
  2. mysql创建表添加字段注释的实现方法
  3. Navicat Premium15连接云服务器中的数据库问题及遇到坑
  4. 详解MySQL 数据库隔离级别与MVCC
  5. MySQL中查看数据库安装路径的方法
  6. mysql数据库删除重复数据只保留一条方法实例
  7. android从不同的layout添加tab页内容_tabhost
  8. 2010.11.15———android spinner下拉列表
  9. android添加WMS图层

随机推荐

  1. Linux&C网络编程————“聊天室”
  2. Linux内核构建系统之一
  3. Linux 下部署Django项目
  4. 如何使用ffmpeg将m4v和wmv视频转换为mp4
  5. Userspace RCU 安装过程记录
  6. linux c 网络编程, 常用网络函数,范例
  7. Linux 多线程 ”一写多读” 模式下的无锁
  8. Linux命令-权限管理命令:chmod
  9. linux c 多进程socket程序,如何实现父进程
  10. Linux关机和重启命令总结