【死磕Sharding-jdbc】—基於 SSM 整合sharding
原文作者:
原文連結:
本篇文章講解如何在ssm(spring、springmvc、mybatis)結構的程式上整合sharding-jdbc(版本為2.0.3)進行分庫分表;
假設分庫分錶行為如下:
將auth_user表分到4個庫(user_0~user_3)中;
其他表不進行分庫分表,保留在default_db庫中;
1. POM配置
以spring配置檔案為例,新增如下POM配置:
io.shardingjdbc ,差異還是比較大,大概提現在如下一些地方:
namespace由rdb改為sharding;
預設資料庫策略和預設表策略被設定為``節點的屬性,分別是
default-database-strategy-ref
和default-table-strategy-ref
;預設資料來源被設定為``節點的屬性,即
default-data-source-name
;``一些屬性變更,例如:actual-tables改為actual-data-nodes,database-strategy改為database-strategy-ref;
我們平常開發過程中,可以參考sharding-jdbc原始碼sharding-jdbc-core-spring-namespace模組中META.rdb目錄下的xml,作者對幾乎各種使用方式都有例項;
分庫邏輯
AuthUserDatabaseShardingAlgorithm
的程式碼很簡單,原始碼如下:/** * @author wangzhenfei9 * @version 1.0.0 * @since 2018年05月14日 */public class AuthUserDatabaseShardingAlgorithm implements PreciseShardingAlgorithm{ private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final int SHARDING_NUMBER = 4; @Override public String doSharding(final Collection availableTargetNames, final PreciseShardingValue shardingValue) { for (String each : availableTargetNames) { if (each.endsWith(shardingValue.getValue() % SHARDING_NUMBER + "")) { logger.debug("the target database name: {}", each); return each; } } throw new UnsupportedOperationException(); }} 這段程式碼參考sharding-jdbc原始碼中
PreciseShardingAlgorithm.java
介面的實現即可,例如PreciseModuloDatabaseShardingAlgorithm.java
;這裡和sharding-jdbc1.5.4.1版本的差異也比較大,sharding-jdbc1.5.4.1對於分庫或者分表sharding演算法實現的介面是不一樣的,sharding-jdbc2.0.3將兩者合二為一,且只有一個方法,即doSharding();4. 注意事項
無法識別sharding-jdbc分庫分表規則inline-expression問題,例如:
``
根本原因:
根本原因是spring把${}
當做佔位符,${0..3}
這種表示式,spring會嘗試去properties檔案中找key為0..3
的屬性。但是這裡是sharding-jdbc分庫分表規則的inline表示式,需要spring忽略這種行為。否則會丟擲異常:
java.lang.IllegalArgumentException: Could not resolve placeholder '0..3' in value "sj_ds_${0..3}.auth_user"
解決辦法:
配置:或者:
5. Main測試
Main.java用來測試分庫分表是否OK,其原始碼如下:
/** * @author wangzhenfei9 * @version 1.0.0 * @since 2018年05月14日 */public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "/META-INF/spring/spring-*.xml"); // auth_user有進行分庫, AuthUserMapper authUserMapper = context.getBean(AuthUserMapper.class); AuthUser authUser = authUserMapper.selectByPrimaryKey(7L); System.out.println("-----> The auth user: "+JSON.toJSONString(authUser)); // user_permission沒有分庫分表 UserPermissionMapper userPermissionMapper = context.getBean(UserPermissionMapper.class); UserPermission userPermission = userPermissionMapper.selectPermissionByUsername("wangzhenfei", "FINANCE_WALLET"); System.out.println("-----AuthUserMapper.selectByPrimaryKey()和UserPermissionMapper.selectPermissionByUsername()的程式碼和沒有分庫分表的程式碼完全一樣;
6. 遺留問題
Main方法測試,或者啟動服務後的呼叫測試都沒有問題,但是透過junit測試用例訪問就會丟擲異常,作為一個待解決的遺留問題:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 6: sj_ds_0,sj_ds_1,sj_ds_2,sj_ds_3,sj_ds_default,shardingDataSource
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2894/viewspace-2802282/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於Sharding-Jdbc 實現的讀寫分離實現JDBC
- Sharding-JDBC測試ChatGPTJDBCChatGPT
- Sharding-JDBC 核心之路由引擎JDBC路由
- Sharding-JDBC分片策略詳解(二)JDBC
- Sharding-JDBC 原始碼之 SQL 解析JDBC原始碼SQL
- Sharding-JDBC 快速入門第一課JDBC
- Sharding-JDBC 使用入門和基本配置JDBC
- SpringBoot使用Sharding-JDBC分庫分表Spring BootJDBC
- SpringBoot使用Sharding-JDBC讀寫分離Spring BootJDBC
- Sharding-JDBC基本使用,整合Springboot實現分庫分表,讀寫分離JDBCSpring Boot
- 【死磕NIO】— NIO基礎詳解
- 非規範SQL的sharding-jdbc實踐SQLJDBC
- Sharding-JDBC foreach批量更新事務異常JDBC
- Sharding-JDBC 原始碼之啟動流程分析JDBC原始碼
- 死磕Java——ReentrantLockJavaReentrantLock
- 採用Sharding-JDBC解決分庫分表JDBC
- ssm整合SSM
- sharding-jdbc水平垂直分庫分表環境搭建JDBC
- sharding-jdbc 相容 MybatisPlus的動態資料來源JDBCMyBatis
- 死磕java concurrent包系列(三)基於ReentrantLock理解AQS的條件佇列JavaReentrantLockAQS佇列
- 死磕 Elasticsearch 方法論Elasticsearch
- 死磕阻塞佇列佇列
- 騰訊死磕SLG!
- SSM學習筆記3——整合 SpringMVC、整合SSMSSM筆記SpringMVC
- Sharding-JDBC原始碼解析與vivo的定製開發JDBC原始碼
- SSM框架整合SSM框架
- 整合SSM框架SSM框架
- 死磕Java——volatile的理解Java
- 死磕The Swift Programming Language——學Swift
- 死磕java concurrent包系列(四)基於AQS的條件佇列徹底理解ArrayBlockingQueueJavaAQS佇列BloC
- 死磕java concurrent包系列(五)基於AQS的條件佇列把LinkedBlockingQueue“扒光”JavaAQS佇列BloC
- 死磕安卓前序:MVP架構探究之旅—基礎篇安卓MVP架構
- 【死磕 Java 基礎】 — 自己動手實現一個 LRUJava
- SSM整合步驟SSM
- SSM整合開發SSM
- SpringMVC-整合SSMSpringMVCSSM
- SSM框架的整合SSM框架
- 八、SpringMVC——ssm整合SpringMVCSSM