Springboot 配置 doris 連接

Springboot 配置 doris 連接

一. 使用 druid 連接池

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

首先需要引入 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=3username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 20 # 初始化時預創建的連接數min-idle: 20  #最低 保持空閑的連接數max-active: 200 # 最大連接池數量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 # 主動保活連接,避免網絡層斷鏈phy-timeout-millis: 1800000   # 物理連接的 最大空閑時間,單位是毫秒。remove-abandoned: true # 指定時間內沒有被正常釋放(例如沒有及時關閉),連接池會主動回收這個連接。remove-abandoned-timeout: 300 # 連接被視為廢棄的超時時間,單位為秒。

二.多數據源配置 doris 連接

有的時候我們需要連接多數據源, 比如要同時連接 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=trueusername: rootpassword: 654321driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:validation-query: SELECT 1max-active: 10min-idle: 2initial-size: 2doris: # 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=3username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 20 # 初始化時預創建的連接數min-idle: 20  #最低 保持空閑的連接數max-active: 200 # 最大連接池數量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 # 主動保活連接,避免網絡層斷鏈phy-timeout-millis: 1800000   # 物理連接的 最大空閑時間,單位是毫秒。remove-abandoned: true # 指定時間內沒有被正常釋放(例如沒有及時關閉),連接池會主動回收這個連接。remove-abandoned-timeout: 300 # 連接被視為廢棄的超時時間,單位為秒。

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

2.doris 數據庫數據源配置:

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 數據庫數據源配置* 指定要掃描的 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.*";/*** 創建 Doris 數據源 Bean,注入名稱為 "dorisDataSource"* @return*/@Bean("dorisDataSource")@ConfigurationProperties(prefix = "spring.datasource.doris")public DataSource getDb1DataSource(){// 構建數據源對象(默認用的是 HikariDataSource, 這個需要注意)//        return DataSourceBuilder.create().build();return new com.alibaba.druid.pool.DruidDataSource();}/*** 創建 SqlSessionFactory Bean,供 MyBatis 使用,注入名為 "dorisSqlSessionFactory"* @param dataSource 注入上面定義的 Doris 數據源* @return* @throws Exception*/@Bean("dorisSqlSessionFactory")public SqlSessionFactory dorisSqlSessionFactory(@Qualifier("dorisDataSource") DataSource dataSource) throws Exception {// 創建工廠 BeanSqlSessionFactoryBean bean = new SqlSessionFactoryBean();// 設置數據源bean.setDataSource(dataSource);// 加載 Mybatis XML 文件bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));// 設置實體類包路徑,用于簡化 XML 中類型的全路徑書寫bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);// 獲取 SqlSessionFactory 實例return bean.getObject();}/*** 創建 SqlSessionTemplate Bean(線程安全的 SqlSession 封裝)* 用于執行 SQL、提交/回滾事務等* @param sqlSessionFactory* @return*/@Bean("dorisSqlSessionTemplate")public SqlSessionTemplate dorisSqlSessionTemplate(@Qualifier("dorisSqlSessionFactory") SqlSessionFactory sqlSessionFactory){// 創建并返回模板實例return new SqlSessionTemplate(sqlSessionFactory);}}

3.msyql 數據庫數據源配置:

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 數據庫數據源配置* 指定要掃描的 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.*";/*** 創建 MySQL 數據源對象* 被 @Primary 標記為主數據源,默認注入優先使用這個* 從 application.yml 讀取以 spring.datasource.mysql 為前綴的屬性進行綁定*/@Primary@Bean(name="mysqlDataSource")@ConfigurationProperties(prefix = "spring.datasource.mysql")public DataSource mysqlDataSource() {// 使用 DataSourceBuilder 構建數據源,支持 HikariCP、Druid 等(取決于依賴)
//        return DataSourceBuilder.create().build();return new com.alibaba.druid.pool.DruidDataSource();}/*** 創建 MySQL 對應的 SqlSessionFactory,供 MyBatis 使用* 指定數據源、Mapper XML 文件路徑、實體別名路徑* @param dataSource 注入 mysqlDataSource*/@Primary@Bean("mysqlSqlSessionFactory")public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {// 創建 SqlSessionFactoryBean(MyBatis 與 Spring 整合的橋梁)SqlSessionFactoryBean bean = new SqlSessionFactoryBean();// 設置數據源bean.setDataSource(dataSource);// 指定 MyBatis 的 mapper XML 文件路徑(如果不配會找不到 SQL 映射)bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_LOCATION));// 設置實體類所在包,用于自動生成別名bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);// 返回 SqlSessionFactory 實例return bean.getObject();}/*** 創建 MyBatis 的 SqlSessionTemplate(線程安全、Spring 管理的 SqlSession)* 用于執行 SQL 操作、事務管理等* @param sqlSessionFactory 注入上一步創建的 SqlSessionFactory*/@Primary@Bean("mysqlSqlSessionTemplate")public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){// 用工廠創建出模板return new SqlSessionTemplate(sqlSessionFactory);}
}

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

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

如果采用:

return DataSourceBuilder.create().build();

最終將默認采用 Spring Boot 內建的 Hikari 數據源模塊。

三.druid 狀態監控

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@Autowiredprivate DruidDataSource dataSource;// 每1分鐘輸出一次連接池的狀態@Scheduled(fixedRate = 600000)public void printDruidStats() {System.out.println("活躍連接數 : " + dataSource.getActiveCount());System.out.println("空閑連接數 : " + dataSource.getPoolingCount());System.out.println("最大允許的活躍連接數 : " + dataSource.getMaxActive());System.out.println("連接池中獲取連接的最大等待時間 : " + dataSource.getMaxWait());System.out.println("連接池創建過的連接總數 : " + dataSource.getCreateCount());System.out.println("已經關閉的連接總數 : " + dataSource.getCloseCount());System.out.println("===================================");}
}

四. 連接超時問題

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

例如:

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91601.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 系統啟動與 GRUB2 核心操作指南

Linux 系統啟動與 GRUB2 核心操作指南 Linux 系統的啟動過程是一個環環相扣的鏈條&#xff0c;從硬件自檢到用戶登錄&#xff0c;每一步都依賴關鍵組件的協作。其中&#xff0c;GRUB2 引導器和systemd 進程是核心樞紐&#xff0c;而運行級別則決定了系統的啟動狀態。以下是系統…

供應鏈分銷代發源碼:一站式打通供應商供貨、平臺定價、經銷商批發及零售環節

在當前復雜的市場環境中&#xff0c;供應鏈管理成為企業發展的關鍵。尤其對于電商平臺來說&#xff0c;高效、精準的供應鏈管理不僅能提升運營效率&#xff0c;還能增強市場競爭力。為了應對日益復雜的供應鏈挑戰&#xff0c;核貨寶供應鏈分銷代發系統應運而生&#xff0c;旨在…

機器學習、深度學習與數據挖掘:核心技術差異、應用場景與工程實踐指南

技術原理與核心概念數據挖掘作為知識發現的關鍵技術&#xff0c;其核心在于通過算法自動探索數據中的潛在模式。關聯規則挖掘可以發現項目之間的有趣關聯&#xff0c;如經典的"啤酒與尿布"案例&#xff1b;聚類分析能夠將相似對象自動分組&#xff0c;常用于客戶細分…

《C++初階之STL》【stack/queue/priority_queue容器適配器:詳解 + 實現】(附加:deque容器介紹)

【stack/queue/priority_queue容器適配器&#xff1a;詳解 實現】目錄前言&#xff1a;------------標準接口介紹------------一、棧&#xff1a;stack標準模板庫中的stack容器適配器是什么樣的呢&#xff1f;1. 棧的基本操作std::stack::topstd::stack::pushstd::stack::pop2…

Thymeleaf 模板引擎原理

Thymeleaf 的模板文件&#xff0c;本質上是標準的 HTML 文件&#xff0c;只是“加了標記&#xff08; th&#xff1a;&#xff09;的屬性”&#xff0c;讓模板引擎在服務端渲染時能 識別并處理 這些屬性&#xff0c;從而完成數據&#xff08;model&#xff09; 的填充。<!DO…

5、生產Redis高并發分布式鎖實戰

一、核心問題與解決方案 問題本質 #mermaid-svg-W1SnVWZe1AotTtDy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W1SnVWZe1AotTtDy .error-icon{fill:#552222;}#mermaid-svg-W1SnVWZe1AotTtDy .error-text{fill:#5…

CS231n-2017 Lecture8深度學習框架筆記

深度學習硬件&#xff1a;CPU:CPU有數個核心&#xff0c;每個核心可以獨立工作&#xff0c;同時進行多個線程&#xff0c;內存與系統共享GPU&#xff1a;GPU有上千個核心&#xff0c;但每個核心運行速度很慢&#xff0c;適合并行做類似的工作&#xff0c;不能獨立工作&#xff…

以ros的docker鏡像為例,探討docker鏡像的使用

標題以ros的docker鏡像為例&#xff0c;探討docker鏡像的使用&#xff08;待完善&#xff09; 1. docker介紹&#xff08;以ros工程距離&#xff09; &#xff08;1&#xff09;個人理解&#xff1a;docker就是一個容器&#xff0c;主要的作用就是將環境打包好&#xff0c;方…

Android Audio實戰——TimeCheck機制解析(十三)

上一篇文章我們雖然通過 tombstoned Log 推斷出 audioserver 崩潰的原因就是系統調用內核接口時發生阻塞,導致 TimeCheck 檢測超時異常而崩潰,但并沒有實質性的證據證明是 kernel 層出現問題導致的崩潰,因此這里我們繼續看一下 TimeCheck 的檢測原理。 一、TimeCheck機制 T…

飛機大戰小游戲

1.視覺設計&#xff1a;采用柔和的藍紫色漸變背景&#xff0c;營造夢幻感飛機、敵機和子彈使用柔和的糖果色調添加了粒子爆炸效果&#xff0c;增強視覺反饋星星收集物增加游戲趣味性2.游戲機制&#xff1a;玩家使用左右方向鍵控制飛機移動空格鍵發射子彈P鍵暫停游戲擊落敵機獲得…

Linux 啟動服務腳本

1. 創建命令文件# 創建可執行文件 touch 文件名稱 例&#xff1a; touch stopServer.sh2. 命令文件授權# 授權文件可執行權限 chmod 777 文件名稱 例&#xff1a; chmod 777 stopServer.sh3. 停止服務命令編寫#!/bin/bash# 獲取進程號 pidps -ef | grep -- /mnt/apache-tomcat-…

【華為機試】34. 在排序數組中查找元素的第一個和最后一個位置

文章目錄34. 在排序數組中查找元素的第一個和最后一個位置描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析雙重二分查找詳解左邊界查找過程右邊界查找過程算法流程圖邊界情況分析各種解法對比二分查找變種詳解時間復…

【網絡編程】WebSocket 實現簡易Web多人聊天室

一、實現思路 Web端就是使用html JavaScript來實現頁面&#xff0c;通過WebSocket長連接和服務器保持通訊&#xff0c;協議的payload使用JSON格式封裝 服務端使用C配合第三方庫WebSocket和nlonlohmann庫來實現 二、Web端 2.1 界面顯示 首先&#xff0c;使用html來設計一個…

AI 驅動、設施擴展、驗證器強化、上線 EVM 測試網,Injective 近期動態全更新!

作為一個專注于金融應用、且具有高度可互操作性的高性能 Layer-1 區塊鏈&#xff0c;Injective 自誕生以來便為開發者提供有即插即用的技術模塊&#xff0c;以便開發者能夠更好地搭建新一代 Web3 金融類應用。談及項目發展的愿景和基本定位&#xff0c;創始團隊曾提到希望 Inje…

Qt-----初識

1. 什么是Qt定義&#xff1a;Qt是一個跨平臺的應用程序和用戶界面框架&#xff0c;主要用于開發具有圖形用戶界面的應用程序&#xff0c;同時也支持非GUI程序的開發。 編程語言&#xff1a;主要使用C&#xff0c;但也提供了對Python&#xff08;PyQt&#xff09;、JavaScript&a…

理解微信體系中的 AppID、OpenID 和 UnionID

前言: 在開發微信相關的服務(如小程序,公眾號,微信開放平臺等)時,很多人都會接觸到幾個看起來相似但實際用途不同的額ID: AppiD, OpenID,UnionID. 搞清楚這三者的區別,是微信生態開發中的基本功,本文將從開發者視角觸發,深入淺出地解釋它們的關系,區別以及實際應用場景一.什么是…

FFmpeg,如何插入SEI自定義數據

FFmpeg&#xff0c;如何插入SEI自定義數據 一、什么是SEI&#xff1f; SEI&#xff08;Supplemental Enhancement Information&#xff0c;補充增強信息&#xff09;是H.264/H.265視頻編碼標準中的一種元數據載體&#xff0c;它允許在視頻流中嵌入額外的信息&#xff0c;如時…

為什么分類任務偏愛交叉熵?MSE 為何折戟?

在機器學習的世界里&#xff0c;損失函數是模型的“指南針”——它定義了模型“好壞”的標準&#xff0c;直接決定了參數優化的方向。對于分類任務&#xff08;比如判斷一張圖片是貓還是狗&#xff09;&#xff0c;我們通常會選擇交叉熵作為損失函數&#xff1b;而在回歸任務&a…

[echarts]橫向柱狀圖

前言 接到一個需求&#xff0c;需要展示一個橫向的柱狀圖&#xff0c;按數量從大到小排序&#xff0c;并定時刷新 使用react配合echarts進行實現。 react引入echarts import React, { useEffect, useRef } from react; import * as echarts from echarts; import DeviceApi fro…

【開源項目】輕量加速利器 HubProxy 自建 Docker、GitHub 下載加速服務

??引言?? 如果你經常被 Docker 鏡像拉取、GitHub 文件下載的龜速折磨&#xff0c;又不想依賴第三方加速服務&#xff08;擔心穩定性或隱私&#xff09;&#xff0c;今天分享的 ??HubProxy?? 可能正是你需要的。這個開源工具用一行命令就能部署&#xff0c;以極低資源消…