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

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

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

一. 使用 druid 連接池

因為 Doris 的前端(FE)兼容了 MySQL 協(xié)議,可以像連 MySQL 一樣連 Doris。這是 Doris 的一個核心設(shè)計特性,目的是方便接入、簡化生態(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 # 初始化時預(yù)創(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 # 主動保活連接,避免網(wǎng)絡(luò)層斷鏈
        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 # 初始化時預(yù)創(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 # 主動保活連接,避免網(wǎng)絡(luò)層斷鏈
        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用)
 * 指定對應(yīng)的 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è)置數(shù)據(jù)源
        bean.setDataSource(dataSource);
        // 加載 Mybatis XML 文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));
        // 設(shè)置實體類包路徑,用于簡化 XML 中類型的全路徑書寫
        bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);
        // 獲取 SqlSessionFactory 實例
        return bean.getObject();
    }

    /**
     * 創(chuàng)建 SqlSessionTemplate Bean(線程安全的 SqlSession 封裝)
     * 用于執(zhí)行 SQL、提交/回滾事務(wù)等
     * @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 用)
 * 指定對應(yīng)的 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 對應(yīng)的 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è)置數(shù)據(jù)源
        bean.setDataSource(dataSource);
        // 指定 MyBatis 的 mapper XML 文件路徑(如果不配會找不到 SQL 映射)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));
        // 設(shè)置實體類所在包,用于自動生成別名
        bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);
        // 返回 SqlSessionFactory 實例
        return bean.getObject();
    }

    /**
     * 創(chuàng)建 MyBatis 的 SqlSessionTemplate(線程安全、Spring 管理的 SqlSession)
     * 用于執(zhí)行 SQL 操作、事務(wù)管理等
     * @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) 之上的方法上, 那么整個事務(wù)周期內(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)文章

  • Java中的switch-case語句的語法、特征詳解

    Java中的switch-case語句的語法、特征詳解

    Java中的switch-case語句用于多分支選擇,支持多種數(shù)據(jù)類型,包括整型、字符型、枚舉型、字符串等,它提供了一種更清晰、更高效的方式來處理多個條件分支,本文給大家介紹Java中的switch-case語句的語法、特征詳解,感興趣的朋友一起看看吧
    2025-11-11
  • Java程序運行之JDK,指令javac java解讀

    Java程序運行之JDK,指令javac java解讀

    這篇文章主要介紹了Java程序運行之JDK,指令javac java,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    這篇文章主要為大家介紹了RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Spring ApplicationListener監(jiān)聽器用法詳解

    Spring ApplicationListener監(jiān)聽器用法詳解

    這篇文章主要介紹了Spring ApplicationListener監(jiān)聽器用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Maven快速入門和常用配置方式

    Maven快速入門和常用配置方式

    Apache?Maven?是一個強大的?Java?項目管理工具,通過項目對象模型(POM)和生命周期管理構(gòu)建、依賴和文檔,?它支持依賴管理、構(gòu)建繼承和站點生成,簡化構(gòu)建過程并確保環(huán)境一致性,?關(guān)鍵指令如mvn?clean、mvn?compile和mvn?package等幫助完成構(gòu)建任務(wù)
    2026-05-05
  • Java單線程ThreadLocal串值問題解決方案

    Java單線程ThreadLocal串值問題解決方案

    這篇文章主要介紹了Java單線程ThreadLocal串值問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Spring Boot Async異步執(zhí)行任務(wù)過程詳解

    Spring Boot Async異步執(zhí)行任務(wù)過程詳解

    這篇文章主要介紹了Spring Boot Async異步執(zhí)行任務(wù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • httpclient 請求http數(shù)據(jù),json轉(zhuǎn)map的實例

    httpclient 請求http數(shù)據(jù),json轉(zhuǎn)map的實例

    下面小編就為大家?guī)硪黄猦ttpclient 請求http數(shù)據(jù),json轉(zhuǎn)map的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • kafka生產(chǎn)者發(fā)送消息流程深入分析講解

    kafka生產(chǎn)者發(fā)送消息流程深入分析講解

    本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲。上文說到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進行客戶端與服務(wù)端的通訊協(xié)議
    2023-03-03
  • springboot基于Mybatis mysql實現(xiàn)讀寫分離

    springboot基于Mybatis mysql實現(xiàn)讀寫分離

    這篇文章主要介紹了springboot基于Mybatis mysql實現(xiàn)讀寫分離,需要的朋友可以參考下
    2019-06-06

最新評論

洛川县| 阳原县| 横峰县| 东阿县| 临高县| 神木县| 灵璧县| 文登市| 依安县| 丰镇市| 依安县| 武清区| 聂荣县| 湾仔区| 昌吉市| 巫溪县| 闽侯县| 来安县| 西城区| 上高县| 敦煌市| 辰溪县| 涞水县| 汉寿县| 会宁县| 巴南区| 尖扎县| 七台河市| 偏关县| 弥渡县| 潜山县| 赤壁市| 个旧市| 沙雅县| 伊宁市| 固原市| 喀什市| 理塘县| 三原县| 息烽县| 蓬溪县|