1. 程式人生 > >初步使用sharding-jdbc進行簡單的讀寫分離和水平分片

初步使用sharding-jdbc進行簡單的讀寫分離和水平分片

一.水平分片:(單一表按照一列進行分片)

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"));
    }