利用Sharding-Jdbc組件實現(xiàn)分表
看到了當(dāng)當(dāng)開源的Sharding-JDBC組件,它可以在幾乎不修改代碼的情況下完成分庫分表的實現(xiàn)。摘抄其中一段介紹:
Sharding-JDBC直接封裝JDBC API,可以理解為增強版的JDBC驅(qū)動,舊代碼遷移成本幾乎為零:
- 可適用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
- 可基于任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid等。
- 理論上可支持任意實現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。雖然目前僅支持MySQL,但已有支持Oracle,SQLServer,DB2等數(shù)據(jù)庫的計劃。
先做一個最簡單的試用,不做分庫,僅做分表。選擇數(shù)據(jù)表bead_information,首先復(fù)制成三個表:bead_information_0、bead_information_1、bead_information_2
測試實現(xiàn)過程
前提:已經(jīng)實現(xiàn)srping+mybatis對單庫單表做增刪改查的項目。
1、修改pom.xml增加dependency
<dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>1.4.2</version> </dependency> <dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-config-spring</artifactId> <version>1.4.0</version> </dependency>
2、新建一個sharding-jdbc.xml文件,實現(xiàn)分庫分表的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.dangdang.com/schema/ddframe/rdb http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd"> <!-- 配置數(shù)據(jù)源 --> <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="jdbc:mysql://localhost:3306/beadhouse" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <rdb:strategy id="tableShardingStrategy" sharding-columns="id" algorithm-class="com.springdemo.utill.MemberSingleKeyTableShardingAlgorithm"/> <rdb:data-source id="shardingDataSource"> <rdb:sharding-rule data-sources="dataSource"> <rdb:table-rules> <rdb:table-rule logic-table="bead_information" actual-tables="bead_information_${0..2}" table-strategy="tableShardingStrategy"/> </rdb:table-rules> </rdb:sharding-rule> </rdb:data-source> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="shardingDataSource" /> </bean> </beans>
3、將文件引入spring配置文件中。
需要修改幾個地方,把sqlSessionFactory和transactionManager原來關(guān)聯(lián)的dataSource統(tǒng)一修改為shardingDataSource(這一步作用就是把數(shù)據(jù)源全部托管給sharding去管理)
4、實現(xiàn)分表(分庫)邏輯,我們的分表邏輯類需要實現(xiàn)SingleKeyTableShardingAlgorithm接口的三個方法doBetweenSharding、doEqualSharding、doInSharding
(取模除數(shù)需要按照自己需求改變,我這里分3個表,所以除以3)
import java.util.Collection; import java.util.LinkedHashSet; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm; import com.google.common.collect.Range; public class MemberSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Integer> { @Override public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) { Collection<String> result = new LinkedHashSet<String>(tableNames.size()); Range<Integer> range = (Range<Integer>) shardingValue.getValueRange(); for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) { Integer modValue = i % 3; String modStr = modValue < 3 ? "" + modValue : modValue.toString(); for (String each : tableNames) { if (each.endsWith(modStr)) { result.add(each); } } } return result; } @Override public String doEqualSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) { Integer modValue = shardingValue.getValue() % 3; String modStr = modValue < 3 ? "" + modValue : modValue.toString(); for (String each : tableNames) { if (each.endsWith(modStr)) { return each; } } throw new IllegalArgumentException(); } @Override public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) { Collection<String> result = new LinkedHashSet<String>(tableNames.size()); for (Integer value : shardingValue.getValues()) { Integer modValue = value % 3; String modStr = modValue < 3 ? "" + modValue : modValue.toString(); for (String tableName : tableNames) { if (tableName.endsWith(modStr)) { result.add(tableName); } } } return result; } }
5、配置完成,可以實現(xiàn)增刪改查測試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- sharding-jdbc5.0.0實現(xiàn)分表實踐
- 利用Sharding-Jdbc進行分庫分表的操作代碼
- 使用sharding-jdbc實現(xiàn)水平分庫+水平分表的示例代碼
- springboot實現(xiàn)以代碼的方式配置sharding-jdbc水平分表
- 使用sharding-jdbc實現(xiàn)水平分表的示例代碼
- SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐
- SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例
- Java使用Sharding-JDBC分庫分表進行操作
- Sharding-Jdbc 自定義復(fù)合分片的實現(xiàn)(分庫分表)
相關(guān)文章
Java導(dǎo)出Word文檔的實現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實現(xiàn)方法,在日常的開發(fā)工作中,我們時常會遇到導(dǎo)出Word文檔報表的需求,比如公司的財務(wù)報表、醫(yī)院的患者統(tǒng)計報表、電商平臺的銷售報表等等,需要的朋友可以參考下2023-08-08解決異常FileNotFoundException:class path resource找不到資源文件的問題
今天小編就為大家分享一篇關(guān)于解決異常FileNotFoundException:class path resource找不到資源文件的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Java遍歷輸出指定目錄、樹形結(jié)構(gòu)所有文件包括子目錄下的文件
這篇文章主要介紹了Java遍歷輸出指定目錄、樹形結(jié)構(gòu)下的所有文件包括子目錄中的文件,需要的朋友可以參考下2015-07-07Java中的信息摘要算法MessageDigest類用法詳解
這篇文章主要介紹了Java中的信息摘要算法MessageDigest類用法詳解,java.security.MessageDigest類為應(yīng)用程序提供信息摘要算法的功能,如MD5或SHA-1或SHA-256算法,信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),并輸出固定長度的哈希值,需要的朋友可以參考下2024-01-01Java中關(guān)于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細版)
這篇文章主要介紹了Java中關(guān)于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細版)的相關(guān)資料,需要的朋友可以參考下2016-09-09