別のSpringBoot + Mycat + APOは、読み取りと書き込み

Mycat環境を構築します

ダウンロードMycat
Mycatの文書を
、その後続編が良いスタートのMySQLマスタースレーブレプリケーションを構築しています

# 解压
tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
#启动
./bin/mycat start
#关闭
./bin/mycat stop
#启动日志
tail -f logs/wrapper.log
#运行日志
tail -f logs/mycat.log

ビュー、wrapper.log。図は、下の成功したスタートを表示され
ここに画像を挿入説明
、その後、confディレクトリの入力
設定のschema.xmlを

<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- test是mycat的逻辑库名称,链接需要用的 -->
    <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="noed-1"></schema>
        <!-- database 是MySQL数据库的库名 -->
    <dataNode name="noed-1" dataHost="dbHost1" database="test" />

    <dataHost name="dbHost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 可以配置多个主从 -->
        <writeHost host="hostM1" url="192.168.100.131:3306" user="root" password="root">
            <!-- 可以配置多个从库 -->
            <readHost host="hostS2" url="192.168.100.132:3306" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>

設定のserver.xml

<mycat:server xmlns:mycat="http://io.mycat/">
   <!-- 读写都可用的用户 -->
    <user name="root" defaultAccount="true">
        <property name="password">root</property>
        <property name="schemas">test</property>
    </user>

    <!-- 只读用户 -->
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">test</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>
プロパティ
クライアント接続用ポート番号 8066
サーバ。XMI Mycatプロファイル、アカウント設定、パラメータなど
スキーマ。XMI Mycat対応する物理構成データベースとデータベーステーブル
ルール。XMI Mycatスライス(サブライブラリーサブテーブル)RULES

ここに画像を挿入説明
ここに画像を挿入説明
あなたは、つまり、実際のライブラリ名MySQLで論理ライブラリ名が同じでないときに、これらを設定している問題があります。接続Mycatミドルウェアはテーブルを見つけることができません場合は、テーブルを作成することはできません。その後ビューMycat.logが見る、リアルタイムデータベースクエリは、論理ライブラリーの名前を運びます。設定が間違っているところは明らかではありません。その後一貫にロジックライブラリと本名MySQLデータベースを置く
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ユーザーの構成は、書き込みデータを読み取ることができませんビュー。

Springboot別々の読み取りと書き込み

  • データソース接続の設定
application.yml

spring:
  datasource:
    ####写数据源
    update:
      jdbc-url: jdbc:mysql://192.168.100.150:8066/test
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: root
    ###读数据源
    select:
      jdbc-url: jdbc:mysql://192.168.100.150:8066/test
      driver-class-name: com.mysql.jdbc.Driver
      username: user
      password: user
    type: com.alibaba.druid.pool.DruidDataSource
  • 設定の読み込み、データソースを書きます
DataSourceConfig.java

/**
 * 配置读写数据源
 */
@Configuration
public class DataSourceConfig {

    @Bean(name = "selectDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.select")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "updateDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.update")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

}
  • ローカル・データ・ソースを保存
DataSourceContextHolder.java

/**
 * 保存本地多数据源
 */
@Component
@Lazy(false)
public class DataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    // 设置数据源类型
    public static void setDbType(String dbType) {
        contextHolder.set(dbType);
    }

    public static String getDbType() {
        return contextHolder.get();
    }

    public static void clearDbType() {
        contextHolder.remove();
    }

}
  • 動的な設定の切り替えデータソースクラス
DynamicDataSource.java

/**
 * 该类继承自 AbstractRoutingDataSource 类,在访问数据库时会调用该类的 determineCurrentLookupKey() 方法获取数据库实例的 key
 */
@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {
    private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
    @Autowired
    @Qualifier("selectDataSource")
    private DataSource selectDataSource;
    @Autowired
    @Qualifier("updateDataSource")
    private DataSource updateDataSource;

    /**
     * 返回生效的数据源名称
     */
    @Override
    protected Object determineCurrentLookupKey() {
        logger.info("DataSourceContextHolder:{}", DataSourceContextHolder.getDbType());
        return DataSourceContextHolder.getDbType();
    }
    /**
     * 配置使用的数据源信息,如果不存在就使用默认的数据源
     */
    @Override
    public void afterPropertiesSet() {
        Map<Object, Object> map = new HashMap<>();
        map.put("selectDataSource", selectDataSource);
        map.put("updateDataSource", updateDataSource);
        //注册数据源
        setTargetDataSources(map);
        setDefaultTargetDataSource(updateDataSource);
        super.afterPropertiesSet();
    }
}
  • APO配置
DataSourceAOP.java

@Aspect
@Component
@Lazy(false)
// Order设定AOP执行顺序 使之在数据库事务上先执行
@Order(0)
public class DataSourceAOP {
    private static final Logger logger = LoggerFactory.getLogger(DataSourceAOP.class);
    //横切点
    @Before("execution(* com.yk.service.*.*(..))")
    public void process(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find")
                || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check")) {
            DataSourceContextHolder.setDbType("selectDataSource");
            logger.info("使用的是读数据源:selectDataSource");
        } else {
            DataSourceContextHolder.setDbType("updateDataSource");
            logger.info("使用的是写数据源:updateDataSource");
        }
    }
}

主な構成は、完了した他は、DAO、サービス、コントローラーのアップです。
ここに画像を挿入説明
ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/yangk1996/p/11298761.html