mycat 跨库间连表查询解决方案
一、应对场景
在微服务开发中,假设我们有两个服务,一个是作业系统,一个是admin用户权限系统,他们分别连接不同的库,里面有对应不同的业务表。
admin用户权限系统:
作业系统数据库: 这时我们想查询出指定学校下的,所有学员提交的作业,并且里面带上作业详情。
这个操作必须要连表查询,但是表都在不同的数据库中,怎么解决?
二、解决方案
Mycat中间件来做垂直分库
三、效果
我们先看看效果,后面再看实现
这里我们用mycat连接上面的两台数据库,直接在mycat那里做的连表查询 (只在mycat1.6.5版本及以上支持跨库连表,并且目前只支持两个表连接)
如果我们还需要返回其他表的信息,也就是我们不止要连接两个表,我们是要跨库关联多个表查询。
这时我们可以在每个数据库本身创建视图,然后用mycat对两个视图跨库关联查询
四、实现
1. 过程概述
-
首先我们每个服务有自己单独的数据库,里面的表都不一样 然后我们用mycat对这些表进行配置垂直方向的分库 对外我们的服务访问的db连接是mycat(他会自动分发你的增删改查请求) 查询的sql语句如果是跨库的,必须在这条语句前面加上mycat指定的一句注释
2. 建库、建表、插数据、创建视图
admin用户权限系统的 testdb1
作业系统的 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编程测试
总结
欢迎指出我的错误!
