欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot配置doris連接的實現(xiàn)示例

 更新時間:2025年09月24日 09:19:08   作者:純潔的小魔鬼  
本文介紹了在SpringBoot項目中配置Doris數(shù)據(jù)庫連接的兩種方式,?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一. 使用 druid 連接池

因為 Doris 的前端(FE)兼容了 MySQL 協(xié)議,可以像連 MySQL 一樣連 Doris。這是 Doris 的一個核心設計特性,目的是方便接入、簡化生態(tài)兼容。

首先需要引入 pom 依賴:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

在springboot 的yml文件中配置:

spring:
  datasource:
      url: jdbc:mysql://192.168.1.111:9030/database_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=3
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      druid:
        initial-size: 20 # 初始化時預創(chuàng)建的連接數(shù)
        min-idle: 20  #最低 保持空閑的連接數(shù)
        max-active: 200 # 最大連接池數(shù)量
        max-wait: 30000 # 連接池最大允許等待的時間(單位:毫秒)
        validation-query: SELECT 1 # 驗證連接是否有效
        test-while-idle: true # 在連接池空閑時是否驗證連接的有效性
        test-on-borrow: true # 在從連接池中借用連接時是否驗證連接的有效性
        test-on-return: false # 在連接被歸還到連接池時是否驗證連接的有效性
        time-between-eviction-runs-millis: 30000 # 空閑連接回收的頻率(多久進行一次檢查),單位為毫秒
        min-evictable-idle-time-millis: 300000 # 空閑超過多長時間后在下次檢查時會被回收,單位為毫秒
        max-evictable-idle-time-millis: 600000 # 最大空閑時間的上限, 超過被強制回收
        keep-alive: true # 主動?;钸B接,避免網(wǎng)絡層斷鏈
        phy-timeout-millis: 1800000   # 物理連接的 最大空閑時間,單位是毫秒。
        remove-abandoned: true # 指定時間內(nèi)沒有被正常釋放(例如沒有及時關(guān)閉),連接池會主動回收這個連接。
        remove-abandoned-timeout: 300 # 連接被視為廢棄的超時時間,單位為秒。

二.多數(shù)據(jù)源配置 doris 連接

有的時候我們需要連接多數(shù)據(jù)源, 比如要同時連接 mysql 和 doris, 這時候我們就要進行一些額外的配置。

1.配置文件配置

spring:
  datasource:
    mysql: # mysql 配置
      url: jdbc:mysql://192.168.1.111:3306/mysql_database_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
      username: root
      password: 654321
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      druid:
        validation-query: SELECT 1
        max-active: 10
        min-idle: 2
        initial-size: 2

    doris: # doris配置
      url: jdbc:mysql://192.168.1.111:9030/database_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=3
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      druid:
        initial-size: 20 # 初始化時預創(chuàng)建的連接數(shù)
        min-idle: 20  #最低 保持空閑的連接數(shù)
        max-active: 200 # 最大連接池數(shù)量
        max-wait: 30000 # 連接池最大允許等待的時間(單位:毫秒)
        validation-query: SELECT 1 # 驗證連接是否有效
        test-while-idle: true # 在連接池空閑時是否驗證連接的有效性
        test-on-borrow: true # 在從連接池中借用連接時是否驗證連接的有效性
        test-on-return: false # 在連接被歸還到連接池時是否驗證連接的有效性
        time-between-eviction-runs-millis: 30000 # 空閑連接回收的頻率(多久進行一次檢查),單位為毫秒
        min-evictable-idle-time-millis: 300000 # 空閑超過多長時間后在下次檢查時會被回收,單位為毫秒
        max-evictable-idle-time-millis: 600000 # 最大空閑時間的上限, 超過被強制回收
        keep-alive: true # 主動?;钸B接,避免網(wǎng)絡層斷鏈
        phy-timeout-millis: 1800000   # 物理連接的 最大空閑時間,單位是毫秒。
        remove-abandoned: true # 指定時間內(nèi)沒有被正常釋放(例如沒有及時關(guān)閉),連接池會主動回收這個連接。
        remove-abandoned-timeout: 300 # 連接被視為廢棄的超時時間,單位為秒。

spring.datasource下的 mysql 和 doris可以自己自定義, 因為不管用什么名字, 我們能需在java中進行數(shù)據(jù)庫數(shù)據(jù)源配置。

2.doris 數(shù)據(jù)庫數(shù)據(jù)源配置:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * doris 數(shù)據(jù)庫數(shù)據(jù)源配置
 * 指定要掃描的 Mapper 接口包路徑(Doris用)
 * 指定對應的 SqlSessionFactory Bean 名稱
 * @author HY
 * @date 2025-06-23
 */
@Configuration
@MapperScan(basePackages  = "com.ashen.test.mapper.doris" , sqlSessionFactoryRef = "dorisSqlSessionFactory")
public class DorisConfig {
    /**
     * mybatis xml 文件位置
     */
    private static final String MYBATIS_LOCATION = "classpath*:mybatis/doris/*.xml";

    /**
     * 實體類文件位置
     */
    private static final String TYPE_ALIASES_PACKAGE = "com.ashen.test.common.model.entity.doris.*";

    /**
     * 創(chuàng)建 Doris 數(shù)據(jù)源 Bean,注入名稱為 "dorisDataSource"
     * @return
     */
    @Bean("dorisDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.doris")
    public DataSource getDb1DataSource(){
        // 構(gòu)建數(shù)據(jù)源對象(默認用的是 HikariDataSource, 這個需要注意)
        //        return DataSourceBuilder.create().build();
        return new com.alibaba.druid.pool.DruidDataSource();
    }

    /**
     * 創(chuàng)建 SqlSessionFactory Bean,供 MyBatis 使用,注入名為 "dorisSqlSessionFactory"
     * @param dataSource 注入上面定義的 Doris 數(shù)據(jù)源
     * @return
     * @throws Exception
     */
    @Bean("dorisSqlSessionFactory")
    public SqlSessionFactory dorisSqlSessionFactory(@Qualifier("dorisDataSource") DataSource dataSource) throws Exception {
        // 創(chuàng)建工廠 Bean
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        // 設置數(shù)據(jù)源
        bean.setDataSource(dataSource);
        // 加載 Mybatis XML 文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));
        // 設置實體類包路徑,用于簡化 XML 中類型的全路徑書寫
        bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);
        // 獲取 SqlSessionFactory 實例
        return bean.getObject();
    }

    /**
     * 創(chuàng)建 SqlSessionTemplate Bean(線程安全的 SqlSession 封裝)
     * 用于執(zhí)行 SQL、提交/回滾事務等
     * @param sqlSessionFactory
     * @return
     */
    @Bean("dorisSqlSessionTemplate")
    public SqlSessionTemplate dorisSqlSessionTemplate(@Qualifier("dorisSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        // 創(chuàng)建并返回模板實例
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

3.msyql 數(shù)據(jù)庫數(shù)據(jù)源配置:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * mysql 數(shù)據(jù)庫數(shù)據(jù)源配置
 * 指定要掃描的 Mapper 接口包路徑(Mysql 用)
 * 指定對應的 SqlSessionFactory Bean 名稱
 * @author HY
 * @date 2025-06-23
 */
@Configuration
@MapperScan(basePackages = "com.ashen.test.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlConfig {

    /**
     * mybatis xml 文件位置
     */
    private static final String MYBATIS_LOCATION = "classpath*:mybatis/mysql/*.xml";

    /**
     * 實體類文件位置
     */
    private static final String TYPE_ALIASES_PACKAGE = "com.ashen.test.common.model.entity.mysql.*";

    /**
     * 創(chuàng)建 MySQL 數(shù)據(jù)源對象
     * 被 @Primary 標記為主數(shù)據(jù)源,默認注入優(yōu)先使用這個
     * 從 application.yml 讀取以 spring.datasource.mysql 為前綴的屬性進行綁定
     */
    @Primary
    @Bean(name="mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        // 使用 DataSourceBuilder 構(gòu)建數(shù)據(jù)源,支持 HikariCP、Druid 等(取決于依賴)
//        return DataSourceBuilder.create().build();
        return new com.alibaba.druid.pool.DruidDataSource();
    }

    /**
     * 創(chuàng)建 MySQL 對應的 SqlSessionFactory,供 MyBatis 使用
     * 指定數(shù)據(jù)源、Mapper XML 文件路徑、實體別名路徑
     * @param dataSource 注入 mysqlDataSource
     */
    @Primary
    @Bean("mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        // 創(chuàng)建 SqlSessionFactoryBean(MyBatis 與 Spring 整合的橋梁)
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        // 設置數(shù)據(jù)源
        bean.setDataSource(dataSource);
        // 指定 MyBatis 的 mapper XML 文件路徑(如果不配會找不到 SQL 映射)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));
        // 設置實體類所在包,用于自動生成別名
        bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);
        // 返回 SqlSessionFactory 實例
        return bean.getObject();
    }

    /**
     * 創(chuàng)建 MyBatis 的 SqlSessionTemplate(線程安全、Spring 管理的 SqlSession)
     * 用于執(zhí)行 SQL 操作、事務管理等
     * @param sqlSessionFactory 注入上一步創(chuàng)建的 SqlSessionFactory
     */
    @Primary
    @Bean("mysqlSqlSessionTemplate")
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        // 用工廠創(chuàng)建出模板
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

注: 這里有個坑, 就是在 mysqlDataSource() 方法中, 必須顯示的返回 。

return new com.alibaba.druid.pool.DruidDataSource();

如果采用:

return DataSourceBuilder.create().build();

最終將默認采用 Spring Boot 內(nèi)建的 Hikari 數(shù)據(jù)源模塊。

三.druid 狀態(tài)監(jiān)控

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class DruidMonitor {

    @Lazy
    @Autowired
    private DruidDataSource dataSource;

    // 每1分鐘輸出一次連接池的狀態(tài)
    @Scheduled(fixedRate = 600000)
    public void printDruidStats() {
        System.out.println("活躍連接數(shù) : " + dataSource.getActiveCount());
        System.out.println("空閑連接數(shù) : " + dataSource.getPoolingCount());
        System.out.println("最大允許的活躍連接數(shù) : " + dataSource.getMaxActive());
        System.out.println("連接池中獲取連接的最大等待時間 : " + dataSource.getMaxWait());
        System.out.println("連接池創(chuàng)建過的連接總數(shù) : " + dataSource.getCreateCount());
        System.out.println("已經(jīng)關(guān)閉的連接總數(shù) : " + dataSource.getCloseCount());
        System.out.println("===================================");
    }
}

四. 連接超時問題

空閑連接超時后, 會被連接池回收, 當再次使用該連接的時候, 會報連接已關(guān)閉的錯誤, 這種情況并不常見, 但是有時候又會突然出現(xiàn), 讓我們以為是配置上有問題。

例如:

當我們遇到需要從socket或者消息隊列中持續(xù)取數(shù)據(jù)時, 經(jīng)常會在 while(true) 中接收消息并插入數(shù)據(jù)庫, 如果我們將 @Transactional 放在 while(true) 之上的方法上, 那么整個事務周期內(nèi)都將使用同一個 durid 連接, 如果長時間未從遠程消息隊列或者socket中獲取到數(shù)據(jù), 那么該連接就會被回收, 當再次來到數(shù)據(jù)并寫庫時, 就會報連接已關(guān)閉的錯誤。

    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public void insert() {
        ....

        while(true){
            testMapper.insert(param);
        }
    }

因此要注意: 不要將 @Transactional 加到需要長時間運行的方法之上。

而是將插入方法脫離出去, 如下:

    public void insert() {
        ....

        while(true){
            testMapper.insertData(param);
        }
    }


    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public void insertData() {
        testMapper.insert(param);
    }

到此這篇關(guān)于Springboot配置doris連接的文章就介紹到這了,更多相關(guān)Springboot doris連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你了解JVM內(nèi)存模型

    一篇文章帶你了解JVM內(nèi)存模型

    本文講解了Java 內(nèi)存模型來看看解決可見性、有序性問題的 Java 內(nèi)存模型(JMM),今天通過本文給大家介紹Java 內(nèi)存模型(JVM)的相關(guān)知識,感興趣的朋友一起看看吧
    2021-09-09
  • java 實現(xiàn)DES 加密解密的示例

    java 實現(xiàn)DES 加密解密的示例

    這篇文章主要介紹了java 實現(xiàn)DES 加密解密的示例代碼,幫助大家更好的理解和使用Java進行加解密,感興趣的朋友可以了解下
    2020-12-12
  • Spring-Retry的使用詳解

    Spring-Retry的使用詳解

    在日常的一些場景中, 很多需要進行重試的操作.而spring-retry是spring提供的一個基于spring的重試框架,本文就詳細的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • 關(guān)于同一個service調(diào)用service本身的方法

    關(guān)于同一個service調(diào)用service本身的方法

    這篇文章主要介紹了關(guān)于同一個service調(diào)用service本身的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java8 LocalDateTime極簡時間日期操作小結(jié)

    Java8 LocalDateTime極簡時間日期操作小結(jié)

    這篇文章主要介紹了Java8-LocalDateTime極簡時間日期操作整理,通過實例代碼給大家介紹了java8 LocalDateTime 格式化問題,需要的朋友可以參考下
    2020-04-04
  • Java實現(xiàn)的迷宮游戲

    Java實現(xiàn)的迷宮游戲

    這篇文章主要介紹了如何用Java實現(xiàn)一個迷宮游戲,本倉庫代碼是經(jīng)過eclipse編譯運行過的,一般情況下將本倉庫代碼下載下來之后,使用eclipse編譯直接可以運行。
    2021-04-04
  • Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)

    Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)

    這篇文章主要介紹了Spring Boot與Kotlin定時任務的示例(Scheduling Tasks),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java ArrayList 實現(xiàn)實例講解

    Java ArrayList 實現(xiàn)實例講解

    ArrayList是基于數(shù)組實現(xiàn)的,是一個動態(tài)數(shù)組,其容量能自動增長,類似于C語言中的動態(tài)申請內(nèi)存,動態(tài)增長內(nèi)存。這篇文章主要介紹了java ArrayList 實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問題

    IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問題

    這篇文章主要介紹了IDEA2020 Plugins不能用的解決辦法,文中給大家介紹了Intellij IDEA 2020.1 的Plugins 搜索不了插件,連接超時的問題,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2020-06-06
  • Spring整合Junit詳解

    Spring整合Junit詳解

    Spring 是目前主流的 Java Web 開發(fā)框架,是 Java 世界最為成功的框架。該框架是一個輕量級的開源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit
    2022-07-07

最新評論