springboot多數(shù)據(jù)源實(shí)現(xiàn)方式
1. 引言:多數(shù)據(jù)源的必要性和應(yīng)用場景
在現(xiàn)代軟件開發(fā)中,隨著業(yè)務(wù)的復(fù)雜性增加和數(shù)據(jù)量的急劇膨脹,一個應(yīng)用可能需要同時訪問多種數(shù)據(jù)庫來滿足不同的數(shù)據(jù)處理需求。
例如,一個電子商務(wù)系統(tǒng)可能需要一個數(shù)據(jù)庫來處理交易數(shù)據(jù),另一個數(shù)據(jù)庫來分析用戶行為。這就是多數(shù)據(jù)源配置的必要性所在。
為什么需要多數(shù)據(jù)源?
- 業(yè)務(wù)邏輯分離:不同的數(shù)據(jù)庫可以承載不同的業(yè)務(wù)模塊,例如,訂單處理和用戶分析可以分別在不同的數(shù)據(jù)庫中進(jìn)行,使得業(yè)務(wù)更加清晰,同時提高系統(tǒng)的可維護(hù)性。
- 性能優(yōu)化:通過分散請求到專門的數(shù)據(jù)庫,可以避免單一數(shù)據(jù)庫因請求過多而成為性能瓶頸,從而提高整個應(yīng)用的性能。
- 數(shù)據(jù)安全和隔離:敏感數(shù)據(jù)可以單獨(dú)存儲在更加安全的數(shù)據(jù)庫中,普通數(shù)據(jù)則可以在常規(guī)安全級別的數(shù)據(jù)庫中處理,從而提高數(shù)據(jù)安全性。
- 技術(shù)多樣性:不同的數(shù)據(jù)庫技術(shù)(如關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫)有其特定優(yōu)勢,多數(shù)據(jù)源配置允許在一個項(xiàng)目中利用各種數(shù)據(jù)庫技術(shù)的優(yōu)勢。
應(yīng)用場景
- 大數(shù)據(jù)分析與實(shí)時業(yè)務(wù)系統(tǒng)并行:在很多企業(yè)級應(yīng)用中,通常需要將實(shí)時業(yè)務(wù)數(shù)據(jù)庫和大數(shù)據(jù)分析數(shù)據(jù)庫分開管理,以免復(fù)雜的數(shù)據(jù)分析操作影響到核心業(yè)務(wù)系統(tǒng)的性能。
- 微服務(wù)架構(gòu):在微服務(wù)架構(gòu)中,各個微服務(wù)可能需要獨(dú)立的數(shù)據(jù)庫實(shí)例,以保持服務(wù)的自治性和解耦。
- 遺留系統(tǒng)整合:在新舊系統(tǒng)整合過程中,可能需要同時接入新舊系統(tǒng)的數(shù)據(jù)庫,以保證數(shù)據(jù)的完整性和一致性。
- 跨地域數(shù)據(jù)處理:全球化業(yè)務(wù)可能需要在不同地域部署數(shù)據(jù)庫,以減少數(shù)據(jù)訪問延遲和符合地域數(shù)據(jù)法規(guī)。
通過這些場景,我們可以看出,多數(shù)據(jù)源的配置不僅是一種技術(shù)需求,更是業(yè)務(wù)發(fā)展和數(shù)據(jù)管理策略的一部分。
2. Spring Boot中的數(shù)據(jù)源配置
Spring Boot極大地簡化了Java應(yīng)用的數(shù)據(jù)庫連接和操作。它通過自動配置支持快速啟動和運(yùn)行,但在處理多數(shù)據(jù)源時,需要進(jìn)行一些額外的配置。
以下是如何在Spring Boot中配置單個默認(rèn)數(shù)據(jù)源以及如何擴(kuò)展到多數(shù)據(jù)源的詳細(xì)說明。
2.1 默認(rèn)數(shù)據(jù)源配置簡介
在Spring Boot中,配置一個默認(rèn)的數(shù)據(jù)源非常簡單。你只需要在application.properties
或application.yml
文件中添加相關(guān)的數(shù)據(jù)庫連接配置即可。Spring Boot使用這些屬性自動配置數(shù)據(jù)源和JPA或JDBC模板。
示例 - application.properties
配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=myuser spring.datasource.password=mypass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
這些配置告訴Spring Boot如何連接到數(shù)據(jù)庫,并使用哪個JDBC驅(qū)動。Spring Boot支持大多數(shù)主流數(shù)據(jù)庫,并自動配置連接池(默認(rèn)是HikariCP
)。
2.2 如何在Spring Boot中配置多個數(shù)據(jù)源
配置多個數(shù)據(jù)源需要更多的手動設(shè)置。你需要定義每個數(shù)據(jù)源的配置,并確保Spring Boot能夠正確地區(qū)分和管理它們。以下是配置多數(shù)據(jù)源的步驟:
步驟 1: 定義數(shù)據(jù)源配置
首先,你需要在配置文件中為每個數(shù)據(jù)源定義不同的前綴。例如:
# 主數(shù)據(jù)源 spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db spring.datasource.primary.username=root spring.datasource.primary.password=123456 spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver # 輔助數(shù)據(jù)源 spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db spring.datasource.secondary.username=root spring.datasource.secondary.password=123456 spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
步驟 2: 創(chuàng)建數(shù)據(jù)源配置類
你需要創(chuàng)建配置類來加載和區(qū)分這些數(shù)據(jù)源。每個數(shù)據(jù)源都應(yīng)該有自己的配置類和@Bean定義。
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }
在這個配置中,@Primary
注解標(biāo)記了主數(shù)據(jù)源,這意味著如果有多個數(shù)據(jù)源可用,Spring Boot會默認(rèn)使用標(biāo)記為@Primary
的數(shù)據(jù)源。
步驟 3: 配置JdbcTemplate或EntityManager
對于每個數(shù)據(jù)源,你可能需要配置一個JdbcTemplate
或EntityManager
以便于操作數(shù)據(jù)庫。
@Bean public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); }
通過以上步驟,你可以在Spring Boot應(yīng)用中配置并使用多個數(shù)據(jù)源。這種配置方式不僅可以滿足復(fù)雜的業(yè)務(wù)需求,還可以幫助你更好地管理和維護(hù)不同的數(shù)據(jù)環(huán)境。
3. 整合MyBatis與多數(shù)據(jù)源
MyBatis 是一個流行的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。在 Spring Boot 應(yīng)用中整合 MyBatis 用于多數(shù)據(jù)源管理,需要一些特定的配置來確保每個數(shù)據(jù)源正確地與對應(yīng)的 SQL 映射和事務(wù)管理器綁定。
配置MyBatis使用多數(shù)據(jù)源
要配置 MyBatis 使用多個數(shù)據(jù)源,你需要定義每個數(shù)據(jù)源的 SqlSessionFactory
和 TransactionManager
。這確保了 MyBatis 能夠?yàn)槊總€數(shù)據(jù)庫連接提供獨(dú)立的會話和事務(wù)控制。
- 定義數(shù)據(jù)源:如之前所述,定義多個數(shù)據(jù)源。
- 創(chuàng)建 SqlSessionFactory:為每個數(shù)據(jù)源創(chuàng)建一個
SqlSessionFactory
,這是 MyBatis 的核心組件,用于管理 MyBatis 的所有 SQL 操作。 - 配置 TransactionManager:為每個數(shù)據(jù)源配置一個事務(wù)管理器,確保事務(wù)的正確管理。
@Configuration public class MyBatisConfig { @Bean @Primary public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } @Bean public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } @Bean @Primary public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
Mapper接口的數(shù)據(jù)源指定
在定義了不同的 SqlSessionFactory
后,需要指定每個 Mapper 接口或 XML 映射文件應(yīng)該使用哪個數(shù)據(jù)源。這通常通過在 Mapper 接口上使用特定的注解或通過配置來實(shí)現(xiàn)。
- 使用
@MapperScan
注解指定數(shù)據(jù)源:可以在配置類中使用@MapperScan
注解為不同的包指定不同的SqlSessionFactory
。
@Configuration @MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory") public class PrimaryDataSourceConfig { // Primary data source configuration } @Configuration @MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory") public class SecondaryDataSourceConfig { // Secondary data source configuration }
通過這種方式,你可以確保每個數(shù)據(jù)源的 Mapper 接口只會與指定的 SqlSessionFactory
交互,從而實(shí)現(xiàn)真正意義上的數(shù)據(jù)源隔離。這樣的配置使得管理大型項(xiàng)目中的多數(shù)據(jù)源更加靈活和高效。
4. 數(shù)據(jù)源的動態(tài)路由
在多數(shù)據(jù)源的環(huán)境中,動態(tài)數(shù)據(jù)源路由成為一種強(qiáng)大的策略,允許應(yīng)用程序在運(yùn)行時根據(jù)特定的邏輯或條件選擇不同的數(shù)據(jù)庫。這對于需要根據(jù)用戶請求、事務(wù)特性或其他業(yè)務(wù)邏輯動態(tài)切換數(shù)據(jù)源的應(yīng)用尤其有用。
4.1 什么是數(shù)據(jù)源路由?
數(shù)據(jù)源路由是一種機(jī)制,它根據(jù)一定的規(guī)則動態(tài)地決定數(shù)據(jù)庫操作應(yīng)該走哪個數(shù)據(jù)源。例如,在一個多租戶系統(tǒng)中,每個租戶可能有自己的數(shù)據(jù)庫,系統(tǒng)需要根據(jù)當(dāng)前用戶的租戶信息動態(tài)切換到相應(yīng)的數(shù)據(jù)庫。
4.2 實(shí)現(xiàn)一個簡單的動態(tài)數(shù)據(jù)源路由
為了實(shí)現(xiàn)動態(tài)數(shù)據(jù)源路由,我們通常需要創(chuàng)建一個動態(tài)數(shù)據(jù)源路由器,這個路由器繼承自AbstractRoutingDataSource
,并重寫determineCurrentLookupKey()
方法來決定使用哪個數(shù)據(jù)源鍵。
以下是一個簡單的實(shí)現(xiàn)示例:
1. 定義動態(tài)數(shù)據(jù)源類
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // DynamicDataSourceContextHolder用于持有當(dāng)前線程使用的數(shù)據(jù)源標(biāo)識 return DynamicDataSourceContextHolder.getDataSourceType(); } }
2. 配置動態(tài)數(shù)據(jù)源
在Spring配置文件中,你需要配置DynamicDataSource
作為數(shù)據(jù)源,并指定實(shí)際的數(shù)據(jù)源映射。
@Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); // 設(shè)置默認(rèn)數(shù)據(jù)源 dynamicDataSource.setDefaultTargetDataSource(primaryDataSource()); // 配置多數(shù)據(jù)源 Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("primary", primaryDataSource()); dataSourceMap.put("secondary", secondaryDataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); return dynamicDataSource; } @Bean public DataSource primaryDataSource() { return new HikariDataSource(); // 配置主數(shù)據(jù)源 } @Bean public DataSource secondaryDataSource() { return new HikariDataSource(); // 配置次級數(shù)據(jù)源 } }
3. 使用@Transactional
指定數(shù)據(jù)源
在服務(wù)或數(shù)據(jù)訪問層,你可以通過指定@Transactional
注解的value
屬性來選擇特定的數(shù)據(jù)源。
@Service public class UserService { @Transactional(value = "primaryTransactionManager") public void addUser(User user) { // 使用主數(shù)據(jù)源添加用戶 } @Transactional(value = "secondaryTransactionManager") public User findUser(String username) { // 使用次級數(shù)據(jù)源查找用戶 } }
這樣的設(shè)置允許應(yīng)用在運(yùn)行時根據(jù)業(yè)務(wù)需求靈活選擇合適的數(shù)據(jù)源,從而實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)操作策略和更高的數(shù)據(jù)操作靈活性。
5. 事務(wù)管理配置
在處理多數(shù)據(jù)源時,事務(wù)管理變得尤為重要,因?yàn)椴划?dāng)?shù)氖聞?wù)處理可能導(dǎo)致數(shù)據(jù)不一致和其他嚴(yán)重問題。在Spring Boot應(yīng)用中,正確配置和管理多數(shù)據(jù)源下的事務(wù)是確保數(shù)據(jù)完整性和一致性的關(guān)鍵。
如何管理多數(shù)據(jù)源下的事務(wù)
局部事務(wù):
- 局部事務(wù)是最簡單的事務(wù)類型,它僅涉及單一數(shù)據(jù)源。
- 在Spring Boot中,你可以為每個數(shù)據(jù)源配置一個事務(wù)管理器。
- 然后,你可以在服務(wù)層使用
@Transactional
注解來指定使用哪個事務(wù)管理器。
示例配置事務(wù)管理器:
@Bean public DataSourceTransactionManager transactionManager1(DataSource dataSource1) { return new DataSourceTransactionManager(dataSource1); } @Bean public DataSourceTransactionManager transactionManager2(DataSource dataSource2) { return new DataSourceTransactionManager(dataSource2); }
使用指定的事務(wù)管理器:
@Transactional(transactionManager = "transactionManager1") public void someDataServiceMethod() { // 業(yè)務(wù)邏輯 }
全局事務(wù):
- 全局事務(wù)(也稱為分布式事務(wù))涉及多個數(shù)據(jù)源或服務(wù)。
- 在Spring Boot中,可以使用JTA(Java Transaction API)來配置全局事務(wù)管理器,如Atomikos或Bitronix。
配置全局事務(wù)管理器(使用Atomikos為例):
@Bean(initMethod = "init", destroyMethod = "close") public UserTransactionManager atomikosTransactionManager() throws Throwable { UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setForceShutdown(false); return userTransactionManager; } @Bean public JtaTransactionManager transactionManager(UserTransactionManager userTransactionManager) { JtaTransactionManager transactionManager = new JtaTransactionManager(); transactionManager.setTransactionManager(userTransactionManager); transactionManager.setUserTransaction(userTransactionManager); return transactionManager; }
在服務(wù)層使用全局事務(wù)管理器:
@Transactional public void someDataServiceMethod() { // 業(yè)務(wù)邏輯涉及多個數(shù)據(jù)源 }
配置全局事務(wù)和局部事務(wù)
在配置事務(wù)管理時,你需要決定每個業(yè)務(wù)場景適合使用局部事務(wù)還是全局事務(wù)。局部事務(wù)簡單且性能較好,適用于單一數(shù)據(jù)源操作。全局事務(wù)適用于需要跨多個數(shù)據(jù)庫或服務(wù)的操作,但可能會帶來更高的性能開銷。
確保在配置和使用事務(wù)時,明確區(qū)分不同的事務(wù)管理器,特別是在使用@Transactional
注解時指定正確的管理器,以避免事務(wù)管理混亂導(dǎo)致的數(shù)據(jù)問題。
6. 實(shí)戰(zhàn)示例:完整的多數(shù)據(jù)源配置示例
在這個部分,我們將通過一個實(shí)際的示例來展示如何在Spring Boot應(yīng)用中配置和使用多個數(shù)據(jù)源。這個示例將包括配置文件、數(shù)據(jù)源配置、MyBatis集成、以及動態(tài)數(shù)據(jù)源的實(shí)現(xiàn)。
示例概述
假設(shè)我們有一個應(yīng)用需要同時訪問兩個數(shù)據(jù)庫:一個是主數(shù)據(jù)庫(用于日常業(yè)務(wù)操作),另一個是審計(jì)數(shù)據(jù)庫(用于記錄審計(jì)日志)。我們將使用MySQL作為數(shù)據(jù)庫。
步驟 1: 添加依賴
首先,在pom.xml
中添加必要的依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> </dependencies>
步驟 2: 配置數(shù)據(jù)源
在application.yml
中配置兩個數(shù)據(jù)源:
spring: datasource: primary: jdbc-url: jdbc:mysql://localhost:3306/business_db username: user1 password: pass1 driver-class-name: com.mysql.cj.jdbc.Driver audit: jdbc-url: jdbc:mysql://localhost:3306/audit_db username: user2 password: pass2 driver-class-name: com.mysql.cj.jdbc.Driver
步驟 3: 配置數(shù)據(jù)源 Bean 和 MyBatis
在Spring配置類中配置兩個數(shù)據(jù)源和對應(yīng)的SqlSessionFactory
:
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "auditDataSource") @ConfigurationProperties(prefix = "spring.datasource.audit") public DataSource auditDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "primarySqlSessionFactory") public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } @Bean(name = "auditSqlSessionFactory") public SqlSessionFactory auditSqlSessionFactory(@Qualifier("auditDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } }
步驟 4: 動態(tài)數(shù)據(jù)源路由
實(shí)現(xiàn)一個簡單的動態(tài)數(shù)據(jù)源路由可以通過擴(kuò)展AbstractRoutingDataSource
:
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContext.getCurrentDataSource(); } }
這里的DataSourceContext
是一個管理數(shù)據(jù)源鍵(比如線程本地變量)的工具類,它決定了當(dāng)前線程應(yīng)該使用哪個數(shù)據(jù)源。
步驟 5: 配置和使用
最后,你需要在業(yè)務(wù)邏輯中根據(jù)需要切換數(shù)據(jù)源。這通常是通過在服務(wù)層方法上使用注解或直接調(diào)用DataSourceContext
來設(shè)置數(shù)據(jù)源。
這個示例提供了多數(shù)據(jù)源配置的基本框架,你可以根據(jù)實(shí)際需求調(diào)整和擴(kuò)展,例如添加事務(wù)管理器配置、優(yōu)化連接池設(shè)置等。
7. 簡化多數(shù)據(jù)源管理-dynamic
dynamic-datasource-spring-boot-starter
是一個用于 Spring Boot 應(yīng)用的數(shù)據(jù)源管理框架。它不僅是一個簡單的組件,而是一個完整的解決方案,旨在簡化多數(shù)據(jù)源的配置和管理。這個框架提供了在運(yùn)行時動態(tài)切換數(shù)據(jù)源的能力,這對于需要連接到多個數(shù)據(jù)庫的應(yīng)用程序來說非常有用,特別是在需要實(shí)現(xiàn)讀寫分離或連接到不同類型數(shù)據(jù)庫的場景中。
功能和特點(diǎn)
dynamic-datasource-spring-boot-starter
的主要功能和特點(diǎn)包括:
- 簡化多數(shù)據(jù)源配置:通過在 Spring Boot 應(yīng)用的配置文件中聲明多個數(shù)據(jù)源,使得配置變得簡單直觀。
- 動態(tài)數(shù)據(jù)源切換:提供了基于方法或類的注解(如
@DS
),允許開發(fā)者輕松指定哪個數(shù)據(jù)源應(yīng)該被用于特定的操作。 - 靈活的數(shù)據(jù)源路由:支持基于業(yè)務(wù)邏輯動態(tài)選擇數(shù)據(jù)源,例如根據(jù)用戶的請求參數(shù)或其他邏輯來切換數(shù)據(jù)源。
- 支持主從復(fù)制:非常適合實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,提高數(shù)據(jù)庫操作的效率和性能。
- 與 Spring 生態(tài)系統(tǒng)的集成:與 Spring Boot 和 Spring Data JPA 等其他 Spring 組件良好集成,使得它可以無縫地與現(xiàn)有的 Spring 應(yīng)用協(xié)同工作。
應(yīng)用場景
- 讀寫分離:在需要處理大量讀操作和相對較少的寫操作的應(yīng)用中,可以將讀操作指向從數(shù)據(jù)庫,而寫操作指向主數(shù)據(jù)庫。
- 性能和可用性:通過分散請求到多個數(shù)據(jù)源,可以提高應(yīng)用的響應(yīng)時間和整體性能。
- 數(shù)據(jù)隔離:在多租戶系統(tǒng)中,每個租戶可能需要獨(dú)立的數(shù)據(jù)庫。使用
dynamic-datasource-spring-boot-starter
可以輕松管理每個租戶的數(shù)據(jù)源。
總之,dynamic-datasource-spring-boot-starter
是一個功能強(qiáng)大的多數(shù)據(jù)源管理框架,非常適用于需要高度靈活性和強(qiáng)大數(shù)據(jù)源管理功能的復(fù)雜應(yīng)用程序。它通過簡化配置和增加運(yùn)行時數(shù)據(jù)源切換的能力,極大地提高了開發(fā)效率和應(yīng)用性能。
引入依賴
首先,確保你的 Spring Boot 項(xiàng)目中已經(jīng)添加了 dynamic-datasource-spring-boot-starter
的依賴。如果還沒有添加,可以在 pom.xml
中加入以下依賴:
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>版本</version> </dependency>
版本根據(jù)實(shí)際項(xiàng)目的依賴版本選擇
配置多數(shù)據(jù)源
在 application.yml
或 application.properties
文件中配置多個數(shù)據(jù)源。例如,使用 YAML 格式配置如下:
spring: datasource: dynamic: primary: master # 設(shè)置主數(shù)據(jù)源 datasource: master: url: jdbc:mysql://localhost:3306/master_db username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave_db username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver
使用 @DS 注解
@DS
是一個用于多數(shù)據(jù)源分離的注解,提供了在同一個應(yīng)用中同時使用多個數(shù)據(jù)源的能力。這個注解屬于 dynamic-datasource-spring-boot-starter
庫,用于在 Spring Boot 應(yīng)用中動態(tài)管理多個數(shù)據(jù)源。下面是關(guān)于如何使用 @DS
注解的一些基本信息和示例。
在方法上使用
import com.baomidou.dynamic.datasource.annotation.DS; @Service public class SomeService { @DS("master") public void writeToMaster() { // 這里的操作會使用配置中的 master 數(shù)據(jù)源 } @DS("slave") public void readFromSlave() { // 這里的操作會使用配置中的 slave 數(shù)據(jù)源 } }
在類上使用
如果一個類中的所有方法都應(yīng)該使用同一個數(shù)據(jù)源,可以將 @DS
注解放在類級別:
import com.baomidou.dynamic.datasource.annotation.DS; @DS("slave") @Service public class ReadOnlyService { // 所有方法都將使用 slave 數(shù)據(jù)源 public void queryData() { // ... } }
注意事項(xiàng)
- 確保數(shù)據(jù)源的鍵(如
master
和slave
)與你在配置文件中定義的名稱相匹配。 - 使用
@DS
注解時,動態(tài)數(shù)據(jù)源會在方法調(diào)用前切換到指定的數(shù)據(jù)源,并在方法執(zhí)行完畢后切換回原來的數(shù)據(jù)源。 - 考慮事務(wù)管理的策略,特別是在使用多數(shù)據(jù)源時,可能需要配置多個事務(wù)管理器。
通過這種方式,@DS
注解為處理多數(shù)據(jù)源提供了一個非常靈活和強(qiáng)大的機(jī)制,使得在同一個應(yīng)用中根據(jù)業(yè)務(wù)需要選擇不同的數(shù)據(jù)源變得簡單和直接。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring事務(wù)@Transactional注解四種不生效案例場景分析
這篇文章主要為大家介紹了Spring事務(wù)@Transactional注解四種不生效的案例場景示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Spring IOC原理補(bǔ)充說明(循環(huán)依賴、Bean作用域等)
這篇文章主要介紹了Spring IOC原理補(bǔ)充說明(循環(huán)依賴、Bean作用域等),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08解析Mybatis SqlSessionFactory初始化原理
本文主要介紹了Mybatis SqlSessionFactory初始化原理,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解
這篇文章主要介紹了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能,較為詳細(xì)的講述了橋接模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能相關(guān)操作步驟與注意事項(xiàng),需要的朋友可以參考下2018-05-05java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法2012-11-11Java實(shí)現(xiàn)圖片旋轉(zhuǎn)、指定圖像大小和水平翻轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖像旋轉(zhuǎn),指定圖像大小,水平翻轉(zhuǎn)圖像,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02