最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot添加多數(shù)據(jù)源的方法實(shí)例教程

 更新時(shí)間:2023年09月12日 10:51:51   作者:清風(fēng)怎不知意  
這篇文章主要給大家介紹了關(guān)于springboot添加多數(shù)據(jù)源方法的相關(guān)資料,在實(shí)際開發(fā)中經(jīng)??赡苡龅皆谝粋€(gè)應(yīng)用中可能要訪問多個(gè)數(shù)據(jù)庫多的情況,需要的朋友可以參考下

前言

Spring Boot可以通過配置多個(gè)數(shù)據(jù)源來支持多數(shù)據(jù)源訪問,以下是一個(gè)基本的多數(shù)據(jù)源配置實(shí)例:

添加多數(shù)據(jù)源的配置類

創(chuàng)建一個(gè)配置類來配置多個(gè)數(shù)據(jù)源,可以使用@Configuration和@Primary注解來標(biāo)識(shí)主數(shù)據(jù)源,示例代碼如下:

@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();
    }
}

在這個(gè)配置類中,我們定義了兩個(gè)數(shù)據(jù)源,一個(gè)是主數(shù)據(jù)源,一個(gè)是次要數(shù)據(jù)源。我們使用@ConfigurationProperties注解來設(shè)置每個(gè)數(shù)據(jù)源的配置參數(shù)。

在application.yml中添加數(shù)據(jù)源配置

添加application.yml配置文件,并在文件中添加多個(gè)數(shù)據(jù)源的配置信息,例如:

spring:
  datasource:
    primary:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test1
      username: root
      password: root
    secondary:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test2
      username: root
      password: root

我們使用了Spring Boot的默認(rèn)配置規(guī)則,通過指定數(shù)據(jù)源的名稱和屬性前綴來配置每個(gè)數(shù)據(jù)源。

配置JdbcTemplate來訪問多個(gè)數(shù)據(jù)源

現(xiàn)在我們已經(jīng)定義了兩個(gè)數(shù)據(jù)源,我們需要配置JdbcTemplate來訪問它們。我們可以在使用JdbcTemplate的每個(gè)方法中指定要使用的數(shù)據(jù)源,示例代碼如下:

@Repository
public class UserRepository {
    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;
    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;
    public List<User> getUsersFromPrimary() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(primaryDataSource);
        List<User> users = jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper(User.class));
        return users;
    }
    public List<User> getUsersFromSecondary() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(secondaryDataSource);
        List<User> users = jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper(User.class));
        return users;
    }
}

我們?cè)谧⑷隞dbcTemplate之前使用@Autowired注解將每個(gè)數(shù)據(jù)源注入到存儲(chǔ)庫類中。然后,我們可以在每個(gè)方法中使用JdbcTemplate來訪問不同的數(shù)據(jù)源。

這是一個(gè)基本的多數(shù)據(jù)源配置實(shí)例,你可以在此基礎(chǔ)上進(jìn)一步調(diào)整以滿足你的具體需求。

如果你使用的是MyBatis框架,你可以使用MyBatis的動(dòng)態(tài)數(shù)據(jù)源來實(shí)現(xiàn)多數(shù)據(jù)源配置,具體步驟如下

定義數(shù)據(jù)源配置類

首先,你需要定義一個(gè)數(shù)據(jù)源配置類來讀取和解析配置文件,然后根據(jù)配置創(chuàng)建數(shù)據(jù)源并將其添加到數(shù)據(jù)源列表中,示例代碼如下:

@Configuration
public class DataSourceConfig {
    @Value("${spring.datasource.type}")
    private Class<? extends DataSource> dataSourceType;
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().type(dataSourceType).build();
    }
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().type(dataSourceType).build();
    }
    @Bean(name = "dynamicDataSource")
    public DataSource dynamicDataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource());
        targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource());
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
        return dynamicDataSource;
    }
}

在這個(gè)配置類中,我們使用@ConfigurationProperties注解來讀取每個(gè)數(shù)據(jù)源的配置信息,然后使用DataSourceBuilder創(chuàng)建數(shù)據(jù)源對(duì)象。接著,我們使用DynamicDataSource類來管理多個(gè)數(shù)據(jù)源,將所有數(shù)據(jù)源添加到targetDataSources中并設(shè)置默認(rèn)數(shù)據(jù)源為masterDataSource。

實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源

接下來,你需要實(shí)現(xiàn)一個(gè)動(dòng)態(tài)數(shù)據(jù)源,它可以根據(jù)需要選擇不同的數(shù)據(jù)源,示例代碼如下:

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}

我們繼承了AbstractRoutingDataSource類,覆蓋了它的determineCurrentLookupKey()方法來獲取當(dāng)前線程所需的數(shù)據(jù)源類型,并返回?cái)?shù)據(jù)源名稱。

實(shí)現(xiàn)數(shù)據(jù)源上下文

最后,你需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)源上下文來保存當(dāng)前線程所需的數(shù)據(jù)源類型,示例代碼如下:

public class DynamicDataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
    public static void setDataSourceType(String dataSourceType) {
        contextHolder.set(dataSourceType);
    }
    public static String getDataSourceType() {
        return contextHolder.get();
    }
    public static void clearDataSourceType() {
        contextHolder.remove();
    }
}

我們使用了ThreadLocal來保存當(dāng)前線程所需的數(shù)據(jù)源類型。你可以在需要訪問不同數(shù)據(jù)源的方法中調(diào)用setDataSourceType()方法來設(shè)置當(dāng)前線程所需的數(shù)據(jù)源類型,調(diào)用clearDataSourceType()方法來清除上下文。

最后,在你的MyBatis配置文件中,你可以使用${}占位符引用定義的動(dòng)態(tài)數(shù)據(jù)源,示例代碼如下:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dynamicDataSource"/>
    <property name="typeAliasesPackage" value="com.example.model"/>
</bean>

我們將MyBatis的SqlSessionFactoryBean中的dataSource屬性設(shè)置為定義的動(dòng)態(tài)數(shù)據(jù)源dynamicDataSource即可。

切換數(shù)據(jù)源

最后,你可以在需要訪問不同數(shù)據(jù)源的方法中調(diào)用DynamicDataSourceContextHolder.setDataSourceType()方法來設(shè)置當(dāng)前線程所需的數(shù)據(jù)源類型。例如,你可以定義一個(gè)注解來標(biāo)識(shí)使用哪個(gè)數(shù)據(jù)源,然后在方法上加上這個(gè)注解即可自動(dòng)切換數(shù)據(jù)源。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
    DataSourceType value() default DataSourceType.MASTER;
}
@Aspect
@Component
public class DynamicDataSourceAspect {
    @Pointcut("@annotation(com.example.annotation.DataSource)")
    public void dataSourcePointcut() {
    }
    @Before("dataSourcePointcut()")
    public void before(JoinPoint joinPoint) {
        DataSource dataSource = getDataSource(joinPoint);
        if (dataSource != null) {
            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
        }
    }
    @After("dataSourcePointcut()")
    public void after(JoinPoint joinPoint) {
        DynamicDataSourceContextHolder.clearDataSourceType();
    }
    private DataSource getDataSource(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        if (method.isAnnotationPresent(DataSource.class)) {
            return method.getAnnotation(DataSource.class);
        }
        return null;
    }
}

在這個(gè)例子中,我們定義了一個(gè)@DataSource注解來標(biāo)識(shí)使用哪個(gè)數(shù)據(jù)源,然后使用AOP來自動(dòng)切換數(shù)據(jù)源。在DynamicDataSourceAspect類中,我們使用@Pointcut注解來定義切點(diǎn),然后使用@Before和@After注解來分別在方法調(diào)用前和方法調(diào)用后切換數(shù)據(jù)源。在切換數(shù)據(jù)源時(shí),我們可以通過getDataSource()方法獲取方法上的@DataSource注解,并使用注解中定義的數(shù)據(jù)源類型來設(shè)置當(dāng)前線程所需的數(shù)據(jù)源類型。

總結(jié)

到此這篇關(guān)于springboot添加多數(shù)據(jù)源方法的文章就介紹到這了,更多相關(guān)springboot添加多數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA序列化Serializable及Externalizable區(qū)別詳解

    JAVA序列化Serializable及Externalizable區(qū)別詳解

    這篇文章主要介紹了JAVA序列化Serializable及Externalizable區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)

    Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)

    今天小編就為大家分享一篇關(guān)于Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中的接口以及常見的Cloneable接口用法

    Java中的接口以及常見的Cloneable接口用法

    這篇文章主要介紹了Java中的接口以及常見的Cloneable接口用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于SpringBoot加載Mybatis的TypeAlias問題

    基于SpringBoot加載Mybatis的TypeAlias問題

    這篇文章主要介紹了解決SpringBoot加載Mybatis的TypeAlias問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java元注解meta-annotation和依賴注入詳解

    Java元注解meta-annotation和依賴注入詳解

    這篇文章主要給大家介紹了關(guān)于Java元注解meta-annotation和依賴注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 淺談java中String與StringBuffer的不同

    淺談java中String與StringBuffer的不同

    String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨(dú)占的,是可變的(因?yàn)槊看味际莿?chuàng)建新的對(duì)象?。?/div> 2015-11-11
  • Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解

    Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解

    對(duì)于流式返回,Spring Boot提供了兩種不同的方式,下面這篇文章主要給大家介紹了關(guān)于Java如何基于okhttp請(qǐng)求SSE接口流式返回的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • HDFS-Hadoop NameNode高可用機(jī)制

    HDFS-Hadoop NameNode高可用機(jī)制

    本文詳細(xì)介紹了Hadoop NameNode高可用機(jī)制的各個(gè)方面內(nèi)容,NameNode 的可用性直接決定了 Hadoop 集群的可用性,感興趣的小伙伴可以參考本文章
    2021-08-08
  • Java中的泛型

    Java中的泛型

    這篇文章主要介紹為何要泛型,如何使用泛型,自定義泛型的方法,泛型類的子類等多方面介紹了JAVA中的泛型,需要的小伙伴請(qǐng)看下文
    2021-08-08
  • java程序打包成exe與jar的圖文教程

    java程序打包成exe與jar的圖文教程

    這篇文章主要介紹了java程序打包成exe與jar的圖文教程,有需要的朋友可以參考一下
    2014-01-01

最新評(píng)論

海盐县| 滁州市| 沅陵县| 宁河县| 梅州市| 陵川县| 堆龙德庆县| 贵州省| 芜湖县| 上饶市| 仲巴县| 出国| 乾安县| 东方市| 宜良县| 彭阳县| 晋中市| 彭州市| 那曲县| 曲靖市| 卢湾区| 唐山市| 托里县| 道孚县| 日土县| 固阳县| 杂多县| 望谟县| 淳安县| 维西| 阳朔县| 常山县| 岳阳市| 柏乡县| 安岳县| 友谊县| 江孜县| 桃园市| 厦门市| 西乡县| 敦化市|