分布式數據庫中間件之sharding-jdbc
小編今天在做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