文章目录
- 一、应对场景
- 二、解决方案
- 三、效果
- 四、实现
- 1. 过程概述
- 2. 建库、建表、插数据、创建视图
- 3. 配置 mycat 的 schema.xml
- 4. 测试
- navicat直接测试
- java编程测试
- 总结
一、应对场景
在微服务开发中,假设我们有两个服务,一个是作业系统,一个是admin用户权限系统,他们分别连接不同的库,里面有对应不同的业务表。
admin用户权限系统:
作业系统数据库:
这时我们想查询出指定学校下的,所有学员提交的作业,并且里面带上作业详情。
这个操作必须要连表查询,但是表都在不同的数据库中,怎么解决?
二、解决方案
Mycat中间件来做垂直分库
三、效果
我们先看看效果,后面再看实现
这里我们用mycat连接上面的两台数据库,直接在mycat那里做的连表查询
(只在mycat1.6.5版本及以上支持跨库连表,并且目前只支持两个表连接)
如果我们还需要返回其他表的信息,也就是我们不止要连接两个表,我们是要跨库关联多个表查询。
这时我们可以在每个数据库本身创建视图,然后用mycat对两个视图跨库关联查询
四、实现
1. 过程概述
- 首先我们每个服务有自己单独的数据库,里面的表都不一样
- 然后我们用mycat对这些表进行配置垂直方向的分库
- 对外我们的服务访问的db连接是mycat(他会自动分发你的增删改查请求)
- 查询的sql语句如果是跨库的,必须在这条语句前面加上mycat指定的一句注释
2. 建库、建表、插数据、创建视图
admin用户权限系统的 testdb1
create database testdb1;
user testdb1;
CREATE TABLE `organization` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL COMMENT '机构名称',
PRIMARY KEY (`id`) USING BTREE
);
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`full_name` varchar(255) DEFAULT NULL COMMENT '中文名(全名)',
`organization_id` bigint(20) DEFAULT NULL COMMENT '机构id',
PRIMARY KEY (`id`) USING BTREE
);
INSERT INTO `organization` VALUES (1, '茂名市第一中学');
INSERT INTO `user` VALUES (1, '1159140456@qq.com', '123456', '李启业', 1);
create view v_usermsg as (
select a.*,b.name as org_name from user a left join organization b on a.organization_id = b.id
);
作业系统的 testdb2
create database testdb2;
user testdb2;
CREATE TABLE `homework` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL COMMENT '作业名',
PRIMARY KEY (`id`) USING BTREE
);
CREATE TABLE `homework_user` (
`homework_id` bigint(20) NOT NULL COMMENT '作业id',
`user_id` bigint(20) NOT NULL COMMENT '用户id',
PRIMARY KEY (`homework_id`, `user_id`) USING BTREE
);
INSERT INTO `homework` VALUES (1, '一班的周五语文作业');
INSERT INTO `homework_user` VALUES (1, 1);
create view v_homework_user as (
select a.*,b.name as homework_name from homework_user a left join homework b on a.homework_id = b.id
);
我这里创建视图是因为:mycat最多只支持跨库的两个表的关联查询,想多个表我这里是通过视图
3. 配置 mycat 的 schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="user" dataNode="dn1"></table>
<table name="organization" dataNode="dn1"></table>
<table name="homework" dataNode="dn2"></table>
<table name="homework_user" dataNode="dn2"></table>
<table name="v_usermsg" dataNode="dn1"></table>
<table name="v_homework_user" dataNode="dn2"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="testdb1" />
<dataNode name="dn2" dataHost="host2" database="testdb2" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.89.176:3306" user="root"
password="root">
</writeHost>
</dataHost>
</mycat:schema>
到这里就已经好了,启动mycat !
4. 测试
navicat直接测试
注意:必须带上注释!
/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select * from homework_user a left join user b on a.user_id = b.id;
/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select * from v_homework_user a left join v_usermsg b on a.user_id = b.id;
java编程测试
我这里用的 mybatis-plus ,直接截图带过
总结
欢迎指出我的错误!
最后
以上就是炙热超短裙最近收集整理的关于mycat 跨库间连表查询解决方案一、应对场景二、解决方案三、效果四、实现总结的全部内容,更多相关mycat内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复