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编程测试


总结

欢迎指出我的错误!

经验分享 程序员 微信小程序 职场和发展