日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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管理,以動態實例化數據源

分享到:
標簽:數據庫
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定