blog

ShardingSphere 4.xのSharding-JDBCは、読み取り/書き込み分離のためのユーザーズマニュアル

これは、JDBCから標準的なインターフェイスを実装しているファクトリとルール設定オブジェクトを介して取得されます。その後、ネイティブのJDBC開発を使用するように選択することができます......

Oct 13, 2020 · 6 min. read
シェア

Springを使用せずに

Mavenの依存関係の紹介

<dependency>
 <groupId>org.apache.shardingsphere</groupId>
 <artifactId>sharding-jdbc-core</artifactId>
 <version>${sharding-sphere.version}</version>
</dependency>

Javaコーディングに基づくルール設定

 // 実際のデータソースを設定する
 Map<String, DataSource> dataSourceMap = new HashMap<>();
 
 // マスターライブラリを構成する
 BasicDataSource masterDataSource = new BasicDataSource();
 masterDataSource.setDriverClassName("com.mysql.jdbc.Driver");
 masterDataSource.setUrl("jdbc:mysql://localhost:3306/ds_master");
 masterDataSource.setUsername("root");
 masterDataSource.setPassword("");
 dataSourceMap.put("ds_master", masterDataSource);
 
 // 最初のスレーブライブラリを構成する
 BasicDataSource slaveDataSource1 = new BasicDataSource();
 slaveDataSource1.setDriverClassName("com.mysql.jdbc.Driver");
 slaveDataSource1.setUrl("jdbc:mysql://localhost:3306/ds_slave0");
 slaveDataSource1.setUsername("root");
 slaveDataSource1.setPassword("");
 dataSourceMap.put("ds_slave0", slaveDataSource1);
 
 // 2番目のスレーブライブラリを構成する
 BasicDataSource slaveDataSource2 = new BasicDataSource();
 slaveDataSource2.setDriverClassName("com.mysql.jdbc.Driver");
 slaveDataSource2.setUrl("jdbc:mysql://localhost:3306/ds_slave1");
 slaveDataSource2.setUsername("root");
 slaveDataSource2.setPassword("");
 dataSourceMap.put("ds_slave1", slaveDataSource2);
 
 // 読み書き分離ルールを設定する
 MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration("ds_master_slave", "ds_master", Arrays.asList("ds_slave0", "ds_slave1"));
 
 // DataSourceオブジェクトを取得する
 DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, masterSlaveRuleConfig, new Properties());

Yamlベースのルール構成

または、Yaml経由で設定してください:

dataSources:
 ds_master: !!org.apache.commons.dbcp.BasicDataSource
 driverClassName: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/ds_master
 username: root
 password: 
 ds_slave0: !!org.apache.commons.dbcp.BasicDataSource
 driverClassName: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/ds_slave0
 username: root
 password:
 ds_slave1: !!org.apache.commons.dbcp.BasicDataSource
 driverClassName: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/ds_slave1
 username: root
 password: 
masterSlaveRule:
 name: ds_ms
 masterDataSourceName: ds_master
 slaveDataSourceNames: [ds_slave0, ds_slave1]
 
props:
 sql.show: true
 DataSource dataSource = YamlMasterSlaveDataSourceFactory.createDataSource(yamlFile);

ネイティブJDBCの使用

DataSource dataSource = YamlMasterSlaveDataSourceFactory.createDataSource(yamlFile);
String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";
try (
 Connection conn = dataSource.getConnection();
 PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
 preparedStatement.setInt(1, 10);
 preparedStatement.setInt(2, 1001);
 try (ResultSet rs = preparedStatement.executeQuery()) {
 while(rs.next()) {
 System.out.println(rs.getInt(1));
 System.out.println(rs.getInt(2));
 }
 }
}

Springの使用

Mavenの依存関係の紹介

<!-- for spring boot -->
<dependency>
 <groupId>org.apache.shardingsphere</groupId>
 <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
 <version>${sharding-sphere.version}</version>
</dependency>
<!-- for spring namespace -->
<dependency>
 <groupId>org.apache.shardingsphere</groupId>
 <artifactId>sharding-jdbc-spring-namespace</artifactId>
 <version>${sharding-sphere.version}</version>
</dependency>

Spring bootに基づくルール構成

spring.shardingsphere.datasource.names=master,slave0,slave1
spring.shardingsphere.datasource.master.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/master
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=
spring.shardingsphere.datasource.slave0.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/slave0
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=
spring.shardingsphere.datasource.slave1.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.url=jdbc:mysql://localhost:3306/slave1
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=
spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave0,slave1
spring.shardingsphere.props.sql.show=true

Spring bootに基づく+ JNDIのルール構成

spring.shardingsphere.datasource.${datasourceName}.jndiNameアプリケーションコンテナでSharding-JDBCを使用する際にSpringBoot + JNDIのアプローチを使用する予定であれば、データソースの一連の設定の代わりに使用することができます。例えば

spring.shardingsphere.datasource.names=master,slave0,slave1
spring.shardingsphere.datasource.master.jndi-name=java:comp/env/jdbc/master
spring.shardingsphere.datasource.slave0.jndi-name=jdbc/slave0
spring.shardingsphere.datasource.slave1.jndi-name=jdbc/slave1
spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave0,slave1
spring.shardingsphere.props.sql.show=true

Springの名前空間に基づくルール構成

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://..//ns"
 xmlns:xsi="http://..//-ce" 
 xmlns:master-slave="http://..///ve" 
 xsi:schemaLocation="http://..//ns 
 http://..///-.sd
 http://..///ve 
 http://..////-.sd 
 ">
 <bean id="ds_master" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3306/ds_master" />
 <property name="username" value="root" />
 <property name="password" value="" />
 </bean>
 <bean id="ds_slave0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3306/ds_slave0" />
 <property name="username" value="root" />
 <property name="password" value="" />
 </bean>
 <bean id="ds_slave1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3306/ds_slave1" />
 <property name="username" value="root" />
 <property name="password" value="" />
 </bean>
 
 <master-slave:data-source id="masterSlaveDataSource" master-data-source-name="ds_master" slave-data-source-names="ds_slave0, ds_slave1" >
 <master-slave:props>
 <prop key="sql.show">true</prop>
 <prop key="executor.size">10</prop>
 <prop key="foo">bar</prop>
 </master-slave:props>
 </master-slave:data-source>
</beans>

Springでデータソースを使う

@Resource
private DataSource dataSource;
Read next

リーコード|サブセット・リ・サブセット|サブセット・いくつ

今日はケビンのアルゴリズムの旅の14日目です。LeetCodeの問題78を説明します。 金曜日を中々難しい問題で締めくくりましょう:新しい部分集合を形成するために、ある数のすべての部分集合をその数に加え、配列を走査して反復します。 空集合[]も部分集合なので、最初に空集合を追加する必要があることを忘れないでください。

Oct 13, 2020 · 3 min read