数据库中间件 MyCAT 源码分析 —— 调试环境搭建
本文主要基于 MyCAT 1.6.5 正式版
- 1. 依赖工具
- 2. 源码拉取
- 3. 数据库配置
- 4. MyCat 配置
- 5. MyCAT 启动
- 6. MyCAT 测试
- 7. 交流
1. 依赖工具
- Maven
- Git
- JDK
- MySQL
- IntelliJ IDEA
2. 源码拉取
从官方仓库 https://github.com/MyCATApache/Mycat-Server Fork
出属于自己的仓库。为什么要 Fork
?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。?
使用 IntelliJ IDEA
从 Fork
出来的仓库拉取代码。拉取完成后,Maven
会下载依赖包,可能会花费一些时间,耐心等待下。
3. 数据库配置
我们要搭建的是非分片表的调试环境,需要创建一个数据库和表:
- 创建数据库:
db01
。 - 创建数据库表:
travelrecord
。
CREATE TABLE `travelrecord` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
4. MyCAT 配置
为了避免对实现源码产生影响,我们选择对 test
目录做变更。
1、在 resources
目录下新建文件夹 backups
,将原 resources
下的所有文件移到 backups
下,这样我们的环境就干干净了。
2、在 resources
目录下新建 schema.xml
文件,配置 MyCAT
的逻辑库、表、数据节点、数据源。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="dbtest" checkSQLschema="true" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1" autoIncrement="true" primaryKey="id" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:33061" user="root" password="123456"> <!-- ‼️‼️‼️ url、user、password 设置成你的数据库 -->
</writeHost>
</dataHost>
</mycat:schema>
3、在 resources
目录下新建 server.xml
文件,配置 MyCAT
系统配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">dbtest</property>
</user>
</mycat:server>
5. MyCAT 启动
1、在 java
目录下新建 debugger
包,和原先已存在的包做区分。
2、在 debbuger
包下新建 MycatStartupTest.java
:
package debugger;
import io.mycat.MycatStartup;
/**
* {@link io.mycat.MycatStartup}测试
*
* Created by yunai on 2017/5/22.
*/
public class MycatStartupTest {
public static void main(String[] args) {
MycatStartup.main(args);
}
}
3、运行 MycatStartupTest.java
,当看到输出日志 MyCAT Server startup successfully. see logs in logs/mycat.log
即为启动成功。
截止目前,test
目录如下:
test目录.png
6. MyCAT 测试
调试环境已经搭建完成,我们看看是否正确。
使用 MySQL
客户端连接 MyCAT
:
- HOST :127.0.0.1
- PORT :8066
- USERNAME :root
- PASSWORD :123456
mysql> insert into travelrecord(name) values ('haha');
Query OK, 1 rows affected (0.01 sec)
mysql> select * from travelrecord;
+--------------------+------+
| id | name |
+--------------------+------+
| 866707181398003712 | haha |
+--------------------+------+
1 rows in set (0.05 sec)
成功。???
7. 交流
感谢阅读、收藏、关注。
知其然知其所以然。学习 MyCAT 会是一段很愉快的旅程。如果有你的交流,相信会更加愉快。欢迎添加微信:wangwenbin-server
进行探讨。
- 两部委印发车联网产业标准体系建设指南 提到了自动驾驶
- 状态开关按钮ToggleButton
- 微软开放 .NET 框架源代码
- Angularjs基础(十二)
- 妙趣横生的HTML5 Page Visibility API
- 禁止/移除 WordPress 4.2 中前台自动加载的 emjo 脚本
- 项目管理方面的几个.NET开源项目
- 如何向十岁以下的朋友解释编程?这个说法碉堡了!
- 快速比较和合并文件
- 前端页面中 iOS 版微信长按识别二维码的bug 与解决方案
- .NET Mass Downloader -整体下载.NET源码
- Android中Button
- Pycharm中一些不为人知的技巧
- Silverlight 2.0 beta1 堆栈
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 汇编基础
- php 使用AMQP扩展调用RabbitMq
- 聊聊RedisTokenVisitor
- R语言几行代码拼接pdf文件
- 一次 Redis 分布式锁事故,整个项目组被扣绩效了。。。
- 小程序访问https显示网络错误,微信打开https空白、浏览器访问正常 解决方案
- Python GUI项目实战(七)学生信息的修改、删除和保存
- Python | 使用argparse解析命令行参数
- LeetCode 98 | 判断二叉搜索树是否合法
- LeetCode 96,n个数构建BST的方法有多少种?
- Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作
- 每日一题 | 二进制操作问题
- Pandas | Dataframe的merge操作,像数据库一样尽情join
- 每日一题 | 灾后重建问题
- 树形结构已知子节点找父节点