初步使用sharding-jdbc進行簡單的讀寫分離和水平分片
阿新 • • 發佈:2018-12-08
一.水平分片:(單一表按照一列進行分片)
1.首先引入maven依賴:(已經更名為shardingsphere)
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>3.0.0</version>
</dependency>
2.編寫yml配置檔案:
dataSources: #資料庫連線資訊 ds0: !!com.zaxxer.hikari.HikariDataSource #資料庫連線池,這裡引入了springboot的jdbc包 driverClassName: org.postgresql.Driver jdbcUrl: jdbc:postgresql://localhost:5432/myuser?useUnicode=true&characterEncoding=utf-8&useSSL=false username: postgres password: 123456 shardingRule: #規則 tables: user_info: #邏輯表明,後面程式碼中sql裡資料庫名用這個 actualDataNodes: ds0.user_info${1..2} #節點名,這裡下面詳細說下 tableStrategy: #表策略 inline: shardingColumn: id #分片規則的列 algorithmExpression: user_info${id} #對應的實際表名 # standard: #用於單分片鍵的標準分片場景 # shardingColumn: id # preciseAlgorithmClassName: com.example.demo.Test #預設資料庫分片策略 #defaultDatabaseStrategy: # shardingColumns: type # algorithmExpression: ds0 # t_order_item: # actualDataNodes: ds${0..1}.t_order_item${0..1} # tableStrategy: # inline: # shardingColumn: order_id # algorithmExpression: t_order_item${order_id % 2} props: sql.show: true #列印sql
注意:
(1)actualDataNodes: ds0.user_info${1..2} 這個對應的是資料庫節點名;ds0代表上面配置的資料庫,後面代表著遞增的資料庫,依次是user_info_1,user_info_2;當然在資料庫中必須都實際存在,否則報錯;當有這個配置項後,操作資料庫的sql中如果不帶有id列,則進行查詢更新刪除新增等都會操作全部表;
(2)如果不加以上的配置項,則不帶id列的sql語句操作,預設會操作user_info表,所以實際資料庫中需要有該表;如果進行其他操作資料庫表,sql語句中必須帶有id列;
(3)該版本中,如使用聚合函式例如count(*),max(),min()等,如果後面不帶有別名則會報錯,好像後面版本會更正;不報錯則需返回別名如:count(*)as count
3.spring中註冊datrasource
@Bean
public DataSource dataSource() throws IOException, SQLException {
DataSource dataSource = YamlShardingDataSourceFactory.createDataSource(ResourceUtils.getFile("classpath:sharding.yml"));
return dataSource;
}
二.讀寫分離
1.先自己實現資料庫的主從等配置
2.編寫配置:
dataSources:
db_master: !!com.zaxxer.hikari.HikariDataSource
driverClassName: org.postgresql.Driver
jdbcUrl: jdbc:postgresql://192.168.134.131:5432/ceshi?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: postgres
password: 123456
db_slave: !!com.zaxxer.hikari.HikariDataSource
driverClassName: org.postgresql.Driver
jdbcUrl: jdbc:postgresql://192.168.134.131:5433/ceshi?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: postgres
password: 123456
masterSlaveRule:
name: db_ms
masterDataSourceName: db_master
slaveDataSourceNames: [db_slave]
3.註冊資料來源
@Bean
public DataSource dataSource() throws FileNotFoundException, SQLException, IOException {
return MasterSlaveDataSourceFactory.createDataSource(ResourceUtils.getFile("classpath:sharding.yml"));
}