我是靠谱客的博主 炙热超短裙,这篇文章主要介绍mycat 跨库间连表查询解决方案一、应对场景二、解决方案三、效果四、实现总结,现在分享给大家,希望可以做个参考。

文章目录

  • 一、应对场景
  • 二、解决方案
  • 三、效果
  • 四、实现
    • 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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部