1. 程式人生 > >分布式數據庫中間件之sharding-jdbc

分布式數據庫中間件之sharding-jdbc

sta math 進行 turn 使用 opened pri import 是我

小編今天在做Sharding-jdbc時出現了一些問題,就上網百一百,發現網上的sharding-jdbc的參考是挺少的,唉還是要繼續學習看文檔。

Sharding-jdbc介紹

Sharding-JDBC是當當應用框架ddframe中,關系型數據庫模塊dd-rdb中分離出來的數據庫水平擴展框架,即透明化數據庫分庫分表訪問。

在互聯網高並發的時代,為了應付DB的高並發讀寫,我們會采用讀寫分離技術。讀寫分離指的是利用數據庫主從技術(把數據復制到多個節點中),分散讀多個庫以支持高並發的讀,而寫只在master庫上。DB的主從技術只負責對數據進行復制和同步,而讀寫分離技術需要業務應用自身去實現。sharding-jdbc通過簡單的開發,可以方便的實現讀寫分離技術。

讀寫分離實現

庫和表結構設計圖:

技術分享圖片

代碼示例

這裏我麽采用了SSH來做的測試(Spring+Struts2+Hibernate)配置請參考: http://www.cnblogs.com/niechen/p/8619713.html

這裏我們采用yml的方式進行分庫分表,這裏只演示了分表,分庫的原理是一樣的 首先創建sharding-jdbc-core.yml文件

dataSources:
  ds: !!com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql:
//localhost:3306/數據庫 username: root password: shardingRule: tables: class: actualDataNodes: ds.class_${0..3} tableStrategy: inline: shardingColumn: id algorithmExpression: class_${id % 4} keyGeneratorColumnName: id defaultKeyGeneratorClass: com.bdqn.lyrk.ssh.study.generator.MyKeyGenerator

技術分享圖片

采用了4張表為例子

這裏簡單介紹一下上面是數據的拆分這裏只做了一個 數據源 !!後面跟的是我們使用的那種數據源有很多dbcp等等..這裏用的阿裏的druid,後面的不用多說了吧

下面是對表的拆分

class:代表的是邏輯表名

actualDataNodes:數據源名.class_${0..3} 也就是class_0,class_1,class_2,class_3對應的這三張表 ,如果是多個數據源的話就是:數據源名_${....}.class_${0..3}

tableStategy下面的參數是設置拆表的規範

shardingColumn:根據哪一列來約定拆表,一般我們都根據主鍵 所以這裏是id

algorithmExpression:約定了拆表的規則,這裏是4張表對應0,1,2,3,那麽如果對4求余那麽值肯定在0~3之間,那麽所以是class_${id % 4}

keyGeneratorColumnName:這裏指定的是id的生成器

defaultKeyGenerotorClass:指定對應我們自己的生成器

技術分享圖片
package com.bdqn.lyrk.ssh.study.generator;

import io.shardingjdbc.core.keygen.KeyGenerator;
import org.springframework.context.annotation.Configuration;

import java.util.Random;

/**
 * @author 楊天樂
 * @date 2018/4/16 21:10
 */
@Configuration
public class MyKeyGenerator implements KeyGenerator {
    @Override
    public Number generateKey() {
        Random random = new Random();
        int rom= random.nextInt(100);
        return rom;
    }
}
View Code

註意這裏用Random生成不要用Math來生成,不然會有小數,那麽一定找不到對應的表,這是小編今天遇到坑爹的問題之一。

接下來我們要加載剛才配置的yml,我們創建一個ShardingJdbcConfig.java

技術分享圖片
package com.bdqn.lyrk.ssh.study.config;

import io.shardingjdbc.core.api.ShardingDataSourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;

/**
 * @author 楊天樂
 * @date 2018/4/16 17:10
 */
@Configuration
public class ShardingJdbcConfig {

    @Bean
    public DataSource dataSource() throws IOException, SQLException {
        DataSource dataSource = ShardingDataSourceFactory.createDataSource(new File(
                ShardingJdbcConfig.class.getClassLoader().getResource("sharding-jdbc-core.yml").getFile()));
        return dataSource;
    }
}
View Code

加載我們yml配置。這裏一定要從ClassLoader裏才能拿到配置

接下來我們來測試一下添加操作(業務層我就不寫了,就一個hibernate的save方法),插入5條數據看他們分別都插入到了哪?(表的數據我都清空了)

技術分享圖片

這是我插入的5條數據按順序0~3

技術分享圖片技術分享圖片技術分享圖片技術分享圖片

大家也可以根據這些id來求一下余,看對應表嗎?

參考sharding官方文檔和官方demo,SSH集成例子 http://www.cnblogs.com/niechen/p/8619713.html

分布式數據庫中間件之sharding-jdbc