您当前的位置:首页 > 电脑百科 > 数据库 > 百科

SpringBoot Mybatis Mycat 多租户数据库实现

时间:2021-08-11 11:03:25  来源:  作者:java乐园

0x01: Mycat

下载

wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz

配置

server.xml,Mycat服务器配置,默认端口8066

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="handleDistributedTransactions">0</property>
<property name="useoffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property>
</system>

<!--Mycat用户名-->
<user name="root">
<!--Mycat密码-->
<property name="password">root</property>
<!--Mycat数据库名-->
<property name="schemas">mycat_test</property>
</user>

</mycat:server>

schema.xml,Mycat和MySQL节点映射配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--Mycat数据库名-->
<schema name="mycat_test" checkSQLschema="true" sqlMaxLimit="100">
<!--Mycat表名,节点名称列表-->
<table name="mycat_test_student" dataNode="dn1,dn2"/>
</schema>
<!--Mycat节点名称、节点地址、mysql数据库名-->
<dataNode name="dn1" dataHost="localhost1" database="db01" />
<dataNode name="dn2" dataHost="localhost1" database="db02" />

<!--Mycat节点地址-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- mysql数据库服务器、账户、密码 -->
<writeHost host="hostM1" url="192.168.1.71:3306" user="test"
password="test@1234">
</writeHost>
</dataHost>
</mycat:schema>

0x02:Spring Boot

数据源配置

#mycat连接信息
spring.datasource.url=jdbc:mysql://localhost:8066/mycat_test?serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#MyBatis拦截器配置
mybatis.config-location=classpath:mybatis.xml

Mybatis

mybatis.xml插件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

<typeAliases>
<typeAlias alias="TestPojo" type="xx.xx.TestPojo"/>
</typeAliases>

<!-- 拦截器插件,改写sql -->
<plugins>
<plugin interceptor="xx.interceptor.MyInterceptor">
</plugin>
</plugins>

</configuration>

拦截器

//拦截StatementHandler的prepare方法
@Intercepts(value = {
@Signature(type = StatementHandler.class,
method = "prepare",
args = {Connection.class,Integer.class})})
public class MyInterceptor implements Interceptor {
// 修改sql,添加前后缀
private static final String preState="/*!mycat:datanode=";
private static final String afterState="*/";

@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler=(StatementHandler)invocation.getTarget();
MetaObject metaStatementHandler=SystemMetaObject.forObject(statementHandler);
Object object=null;
//分离代理对象链
while(metaStatementHandler.hasGetter("h")){
object=metaStatementHandler.getValue("h");
metaStatementHandler=SystemMetaObject.forObject(object);
}

//获取sql
String sql=(String)metaStatementHandler.getValue("delegate.boundSql.sql");

//根据会话上下文,获取节点标识
String node=(String) SessionUtil.getSession().getAttribute("AppId");
if(node!=null) {
//重写sql,适配mycat
sql = preState + node + afterState + sql;
}

System.out.println("sql is "+sql);
metaStatementHandler.setValue("delegate.boundSql.sql",sql);
Object result = invocation.proceed();
System.out.println("Invocation.proceed()");
return result;
}

// 返回当前拦截的对象(StatementHandler)的动态代理
// 当拦截对象的方法被执行时, 动态代理中执行拦截器intercept方法.
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}

@Override
public void setProperties(Properties properties) {
String prop1 = properties.getProperty("prop1");
String prop2 = properties.getProperty("prop2");
System.out.println(prop1 + "------" + prop2);
}
}

总结

以上为关键实现,主要过程如下:

  • 搭建 Mycat 服务,设置提供的数据库信息
  • 配置Mycat动态映射的两个节点,Mycat根据sql语句中的/*!mycat:datanode=dn1*/进行动态切换数据源后执行sql
  • 配置 SpringBoot 的 Mycat 数据源连接
  • 配置 Mybatis 的拦截器插件
  • 配置 Mybatis 拦截器实现,根据上下文节点,改写 sql

注意

  • 生产可采用Mycat集群,集群用ZK管理,以动态实例化数据源


Tags:数据库   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本篇文章主要介绍了使用MyBatis框架完成数据库的增、删、改、查操作。准备工作运行schema.sql和data.sql脚本文件中的 SQL 语句创建t_user表并添加部分测试数据。schema.sql...【详细内容】
2022-07-15  Tags: 数据库  点击:(0)  评论:(0)  加入收藏
mysql中的my.ini路径在哪里mysql中“my.ini”文件:1、linux系统中,该文件的位置是“/etc/mysql/my.cnf”;2、windows系统中,该文件的位置是“C:\Program Files\MySQL\MySQL Serv...【详细内容】
2022-07-15  Tags: 数据库  点击:(0)  评论:(0)  加入收藏
俗话说,天下大势,合久必分、分久必合。数据库领域同样如此。过去五十余年,数据库经历OLTP和OLAP两种需求漫长的融合-分离-再融合的过程。究其原因,数据库的发展始终与用户场景需...【详细内容】
2022-07-14  Tags: 数据库  点击:(4)  评论:(0)  加入收藏
创建数据表1、 基本语法莆田IT外包|服务器虚拟化|数据存储|数据备份|网络故障排除|数据恢复 www.xiaolin.cc需要注意:表需要放在对应的数据库下面,IT外包 服务器虚拟化 数据存...【详细内容】
2022-07-13  Tags: 数据库  点击:(6)  评论:(0)  加入收藏
Javascript无法直接访问SqlServer数据库的,但可以使用浏览器的“执行SQL”功能查询数据库,将查询结果保存在浏览器变量中,然后在Javascript代码中引用这些变量即可。在浏览器的...【详细内容】
2022-07-11  Tags: 数据库  点击:(11)  评论:(0)  加入收藏
使用like、between、in进行模糊查询select * from Studentswhrere 姓名 like &#39;张%&#39;通配符:_ 一个字符,% 任意长度的字符串,[] 括号中所指定的范围内的一个字符,[^]不在...【详细内容】
2022-07-07  Tags: 数据库  点击:(15)  评论:(0)  加入收藏
导读:本文将介绍Apache IoTDB,它是一个基于开放数据格式的数据库。今天的介绍会围绕下面四点展开: Apache IoTDB 简介 时序文件格式 TsFile 基于开放文件的数据库架构 开源社区...【详细内容】
2022-07-06  Tags: 数据库  点击:(22)  评论:(0)  加入收藏
简介SqlRunner,一个非常实用的、用于操作数据库的工具类。该类对JDBC进行了很好的封装,结合SQL工具类,能够很方便地通过Java代码执行SQL语句并检索SQL执行结果。SqlRunner提供...【详细内容】
2022-07-05  Tags: 数据库  点击:(19)  评论:(0)  加入收藏
文丨刘雨琦马云曾说,数据是当下“最贵”的资产,若阿里巴巴不搞云计算,可能就会死掉。而数据库作为整个数据行业的基础软件,正在迎来它的春天。国产数据库的接连上市,为信创风口...【详细内容】
2022-07-05  Tags: 数据库  点击:(20)  评论:(0)  加入收藏
作为轻量级的本地存储方式,对于构建不依赖服务器的小型项目,用LowDB存储和管理数据是十分理想的选择。在Nodejs, Electron and browser等一些小型项目中经常能看到LowDB的身影...【详细内容】
2022-07-04  Tags: 数据库  点击:(30)  评论:(0)  加入收藏
▌简易百科推荐
俗话说,天下大势,合久必分、分久必合。数据库领域同样如此。过去五十余年,数据库经历OLTP和OLAP两种需求漫长的融合-分离-再融合的过程。究其原因,数据库的发展始终与用户场景需...【详细内容】
2022-07-14  大数据在线    Tags:HTAP数据库   点击:(4)  评论:(0)  加入收藏
导读:Apache HBase(Hadoop Database),是一个基于Google BigTable论文设计的高可靠性、高性能、可伸缩的分布式存储系统。全文将围绕以下几个方面展开: HBase是什么 HBase社区的发...【详细内容】
2022-07-08  DataFunTalk    Tags:Apache HBase   点击:(10)  评论:(0)  加入收藏
TimescaleDB 超表TimescaleDB 中使用称为 hypertables 的数据表来存储数据。hypertable(超表)是与数据交互的主要点,因为它提供了可以通过标准 SQL 查询的标准表抽象。 在 Time...【详细内容】
2022-07-07  IT职业教育    Tags:TimescaleDB   点击:(19)  评论:(0)  加入收藏
使用like、between、in进行模糊查询select * from Studentswhrere 姓名 like &#39;张%&#39;通配符:_ 一个字符,% 任意长度的字符串,[] 括号中所指定的范围内的一个字符,[^]不在...【详细内容】
2022-07-07  新米米    Tags:数据库   点击:(15)  评论:(0)  加入收藏
oracle经常需要查数据库表空间大小,使用率,加表空间等,这里总结我经常使用的语句。一、数据表空间相关:查询所有表空间的使用情况:SELECT d.tablespace_name "Name", d.status "S...【详细内容】
2022-07-07  运维Danrtsey    Tags:数据表   点击:(15)  评论:(0)  加入收藏
导读:本文将介绍Apache IoTDB,它是一个基于开放数据格式的数据库。今天的介绍会围绕下面四点展开: Apache IoTDB 简介 时序文件格式 TsFile 基于开放文件的数据库架构 开源社区...【详细内容】
2022-07-06  DataFunTalk    Tags:时序数据库   点击:(22)  评论:(0)  加入收藏
一、问题 在好大夫在线内部,S3系统负责各业务方操作日志的集中存储、查询和管理。目前,该系统日均查询量数千万次,插入量数十万次。随着日志量的不断累积,主表已经达到数十亿,单...【详细内容】
2022-07-05  dbaplus社群    Tags:MongoDB   点击:(16)  评论:(0)  加入收藏
文丨刘雨琦马云曾说,数据是当下“最贵”的资产,若阿里巴巴不搞云计算,可能就会死掉。而数据库作为整个数据行业的基础软件,正在迎来它的春天。国产数据库的接连上市,为信创风口...【详细内容】
2022-07-05  光锥智能    Tags:数据库   点击:(20)  评论:(0)  加入收藏
导读:埋点数据是数据分析、推荐、运营的基础,低延时、稳定、高效的埋点数据流对提高用户体验有着非常重要的作用。而随着流量的增大,埋点的增多,在大流量场景下,埋点数据流的建设...【详细内容】
2022-07-05  DataFunTalk    Tags:数据   点击:(22)  评论:(0)  加入收藏
作为轻量级的本地存储方式,对于构建不依赖服务器的小型项目,用LowDB存储和管理数据是十分理想的选择。在Nodejs, Electron and browser等一些小型项目中经常能看到LowDB的身影...【详细内容】
2022-07-04    效能哥  Tags:数据库   点击:(30)  评论:(0)  加入收藏
站内最新
站内热门
站内头条