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

Spring Boot + KingbaseES 四種主流的數(shù)據(jù)庫連接池

 更新時間:2026年02月05日 10:59:45   作者:篤行其道  
文章介紹了四種主流的數(shù)據(jù)庫連接池(DBCP、C3P0、Druid、HikariCP)在SpringBoot項目中與KingbaseES數(shù)據(jù)庫的配置和使用,以及在實際開發(fā)中遇到的監(jiān)控缺失和參數(shù)調(diào)優(yōu)問題,并給出了相應的解決方案,感興趣的朋友跟隨小編一起看看吧

一、前言

在企業(yè)項目開發(fā)過程中,我們經(jīng)常同時關注進度和性能:頁面需要快速響應,接口需要穩(wěn)定,但數(shù)據(jù)庫連接管理這個隱蔽而關鍵的部分往往被忽略。高峰期如果沒有預先建立連接,應用就像高鐵只剩一條候車通道一樣會堵塞。因此,連接池這種“預先建立通道與閘門”的機制成為了性能優(yōu)化的基礎要件。

近年來,國產(chǎn)數(shù)據(jù)庫KingBaseES在醫(yī)療、交通等安全性和法規(guī)要求極高的領域應用越來越廣泛。許多團隊在從Oracle、PostgreSQL遷移到KingBaseES后,首先面臨的問題就是如何選擇合適的連接池。 DBCP老將軍溫和可靠,C3P0歷史悠久注重可伸縮性,Druid監(jiān)控功能豐富且實用,HikariCP以極致輕盈見長。本文將結合Spring Boot真實開發(fā)場景,分享這四大數(shù)據(jù)庫連接池的配置思路、特點及優(yōu)化要領,助您少走彎路。

二、數(shù)據(jù)庫連接池的作用是什么?

簡而言之,數(shù)據(jù)庫連接池的原理就像提前準備好一桶水放在家里,而不是每次渴了再跑到井邊打水一樣。新建和釋放數(shù)據(jù)庫連接本身就是一項耗時的系統(tǒng)開銷過程:握手、鑒權、資源分配等步驟都不能省略。如果每個HTTP請求獨立建立和斷開連接,勢必給數(shù)據(jù)庫帶來很大壓力。 系統(tǒng)資源在處理重復任務時很容易出現(xiàn)消耗,這對系統(tǒng)的響應能力和通過量都有不利影響。連接池的作用是:在低峰時期預先創(chuàng)建一定數(shù)量的可用連接,形成連接的“池”;在高峰期根據(jù)業(yè)務波動動態(tài)增加或者縮減連接數(shù)量;請求來時從“池”中取出連接使用,用完后再放回“池”中;同時對“池”中的連接進行監(jiān)測,失效的連接予以重新建立。這樣既可以保證系統(tǒng)性能的穩(wěn)定性,也可以通過統(tǒng)計數(shù)據(jù)了解系統(tǒng)和業(yè)務的變化規(guī)律,為后期優(yōu)化提供參考。

三、SpringBoot + KingbaseES 環(huán)境準備

三步心智模型:

  1. 加依賴(讓項目知道怎么連庫)
  2. 填地址(告訴它去哪里、用誰登錄)
  3. 驗連通(啟動時或寫個最小 SQL 探活)

3.1 加依賴(pom.xml)

最少必備 = JDBC + 驅動 + 選一個連接池(別全塞上,沖突或白占空間)。

<dependencies>
    <!-- Spring JDBC 基礎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- KingbaseES 驅動(版本鎖定,跟服務器一致) -->
    <dependency>
        <groupId>com.kingbase8</groupId>
        <artifactId>kingbase8</artifactId>
        <version>8.6.0</version>
    </dependency>
    <!-- 連接池:三選一(推薦 Hikari 或 Druid) -->
    <!-- Druid(生產(chǎn)監(jiān)控友好) -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.18</version>
    </dependency>
    <!-- 或 Apache DBCP2(老系統(tǒng)遷移) -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
    </dependency>
    <!-- 或 HikariCP(高性能 / Spring Boot 默認) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
</dependencies>

提示: 如果用 Spring Boot Starter,很多情況下不必單獨引 HikariCP,它已內(nèi)嵌。

3.2 基礎連接信息(application.yml)

一定核對四件套:地址 / 端口 / 庫名 / 賬號密碼 + 驅動類名。

kingbase:
  driver-class-name: com.kingbase8.Driver
  url: jdbc:kingbase8://127.0.0.1:54321/TEST
  username: SYSTEM
  password: SYSTEM

小建議:
生產(chǎn)別寫死密碼 → 用環(huán)境變量或外部化配置(如:ENC、K8S Secret)
若多數(shù)據(jù)源,分前綴管理,別混在 spring.datasource 根層

四、四類主流連接池實戰(zhàn)

DBCP: 老黃牛,穩(wěn)但不花哨。
C3P0: 功能多,參數(shù)細,適合“歷史復雜場景”兜底。
Druid: 自帶監(jiān)控 + SQL 防火墻,運維愛。
HikariCP: 快、輕、現(xiàn)代、高并發(fā)友好。

4.1 DBCP(遷移型 / 傳統(tǒng)項目友好)

看點:initial-size / max-total / validation-query 三核心。

SpringBoot配置方式

@Configuration
public class DbcpDataSourceConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.dbcp")
    public DataSource dbcpDataSource() {
        return new BasicDataSource();
    }
}

application.yml配置

spring:
  datasource:
    dbcp:
      driver-class-name: com.kingbase8.Driver
      url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: MANAGER
      initial-size: 5
      max-total: 50
      min-idle: 5
      max-idle: 20
      validation-query: SELECT 'x'
      test-on-borrow: true
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000

實際應用示例

@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<User> findAllUsers() {
        return jdbcTemplate.query(
            "SELECT id, name, email FROM users",
            (rs, i) -> {
                User u = new User();
                u.setId(rs.getLong("id"));
                u.setName(rs.getString("name"));
                u.setEmail(rs.getString("email"));
                return u;
            }
        );
    }
}

4.2 C3P0

核心參數(shù):
acquireIncrement:不夠時一次加多少
idleConnectionTestPeriod:健康巡檢周期(秒)
preferredTestQuery:輕量探活

SpringBoot配置方式

@Bean
public DataSource c3p0DataSource() throws PropertyVetoException {
    ComboPooledDataSource ds = new ComboPooledDataSource();
    ds.setDriverClass("com.kingbase8.Driver");
    ds.setJdbcUrl("jdbc:kingbase8://127.0.0.1:54321/TEST");
    ds.setUser("SYSTEM");
    ds.setPassword("SYSTEM");
    ds.setInitialPoolSize(5);
    ds.setMinPoolSize(5);
    ds.setMaxPoolSize(50);
    ds.setAcquireIncrement(3);
    ds.setIdleConnectionTestPeriod(10);
    ds.setPreferredTestQuery("SELECT 1");
    ds.setMaxIdleTime(1800);
    return ds;
}

注意: 巡檢太頻繁(如 <5s)會浪費資源;查詢語句盡量輕。

4.3 Druid(生產(chǎn)推薦 + 可視化)

優(yōu)點:SQL 監(jiān)控、慢 SQL、Wall 防注入、Web 控制臺一站式。

application.yml配置

spring:
  datasource:
    druid:
      driver-class-name: com.kingbase8.Driver
      url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: MANAGER
      initial-size: 5
      max-active: 50
      min-idle: 5
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000
      validation-query: SELECT 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      filters: stat,wall,log4j2
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin123

SpringBoot配置方式

@Configuration
public class DruidConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.druid")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean =
            new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        bean.addInitParameter("loginUsername", "admin");
        bean.addInitParameter("loginPassword", "admin123");
        bean.addInitParameter("resetEnable", "false");
        return bean;
    }
}

控制臺路徑:/druid/index.html
賬號密碼務必生產(chǎn)自定義 + 限制 IP

4.4 HikariCP(SpringBoot默認 / 高性能首選)

特點:啟動快、延遲低、參數(shù)少、容錯好。

application.yml配置

spring:
  datasource:
    hikari:
      driver-class-name: com.kingbase8.Driver
      jdbc-url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: SYSTEM
      minimum-idle: 5
      maximum-pool-size: 50
      connection-timeout: 10000
      idle-timeout: 600000
      max-lifetime: 1800000
      validation-timeout: 5000
      connection-test-query: SELECT 1
      pool-name: KingbaseHikariCP
      auto-commit: true
      leak-detection-threshold: 60000

SpringBoot配置方式

@Configuration
public class HikariTunedConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariDataSource hikariDataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.addDataSourceProperty("cachePrepStmts", "true");
        ds.addDataSourceProperty("prepStmtCacheSize", "250");
        ds.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds.addDataSourceProperty("useServerPrepStmts", "true");
        return ds;
    }
}

五、遇到的問題

監(jiān)控缺失,問題發(fā)現(xiàn)太晚

這個不算技術問題,但影響很嚴重。
事故現(xiàn)場: 系統(tǒng)慢慢變慢,用戶體驗越來越差,但開發(fā)團隊渾然不覺,直到老板親自體驗后發(fā)飆才知道出了問題。
問題根源: 沒有配置合適的監(jiān)控和告警機制,連接池的狀態(tài)變化、慢SQL的增加、連接獲取時間的延長,這些關鍵指標都沒有被監(jiān)控到。
解決方案: 建立完善的監(jiān)控體系:

@Component
public class ConnectionPoolMonitor {
    private static final Logger logger = LoggerFactory.getLogger(ConnectionPoolMonitor.class);
    @Autowired
    private DataSource dataSource;
    @Scheduled(fixedRate = 60000) // 每分鐘檢查一次
    public void monitorConnectionPool() {
        if (dataSource instanceof HikariDataSource) {
            HikariDataSource hikariDS = (HikariDataSource) dataSource;
            HikariPoolMXBean poolMXBean = hikariDS.getHikariPoolMXBean();
            int activeConnections = poolMXBean.getActiveConnections();
            int idleConnections = poolMXBean.getIdleConnections();
            int totalConnections = poolMXBean.getTotalConnections();
            int threadsAwaitingConnection = poolMXBean.getThreadsAwaitingConnection();
            logger.info("連接池狀態(tài) - 活躍:{}, 空閑:{}, 總計:{}, 等待:{}", 
                activeConnections, idleConnections, totalConnections, threadsAwaitingConnection);
            // 告警邏輯
            if (activeConnections > totalConnections * 0.8) {
                logger.warn("連接池使用率過高!活躍連接:{}, 總連接:{}", activeConnections, totalConnections);
                // 發(fā)送告警通知...
            }
            if (threadsAwaitingConnection > 0) {
                logger.error("有線程在等待連接!等待數(shù)量:{}", threadsAwaitingConnection);
                // 發(fā)送緊急告警...
            }
        }
    }
}

經(jīng)驗教訓:

監(jiān)控不是可有可無的,是必需品
關鍵指標要設置閾值告警,不要等到出問題才發(fā)現(xiàn)
Druid的監(jiān)控頁面雖然好用,但不能替代程序化的監(jiān)控和告警

配置參數(shù)"拍腦袋",性能反而變差

這個案例,是關于盲目調(diào)優(yōu)的。
事故現(xiàn)場: 看到網(wǎng)上說HikariCP性能最好,就把所有參數(shù)都調(diào)到"最優(yōu)"值,結果系統(tǒng)性能不升反降。
問題根源: 網(wǎng)上的"最佳實踐"不一定適合自己的場景。比如,把連接數(shù)調(diào)得很大,但實際業(yè)務并發(fā)量不高,反而增加了資源浪費;把超時時間調(diào)得很短,導致正常的長查詢也被中斷。

盲目"優(yōu)化"的配置
spring:
  datasource:
    hikari:
      maximum-pool-size: 200  # 太大了,浪費資源
      connection-timeout: 1000  # 太短了,正常查詢都超時
      idle-timeout: 60000  # 太短了,連接頻繁創(chuàng)建銷毀
      max-lifetime: 300000  # 太短了,增加了不必要的開銷

正確做法: 根據(jù)實際業(yè)務場景,逐步調(diào)優(yōu):

@Component
public class ConnectionPoolTuning {
    public void performanceTuning() {
        // 1. 先測試默認配置的性能基線
        // 2. 分析業(yè)務特點:并發(fā)量、查詢復雜度、事務長度
        // 3. 逐個參數(shù)調(diào)整,每次只改一個參數(shù)
        // 4. 壓測驗證效果
        // 5. 記錄最優(yōu)配置
        System.out.println("調(diào)優(yōu)原則:");
        System.out.println("1. 連接數(shù) = CPU核心數(shù) * 2 + 磁盤數(shù)(起始值)");
        System.out.println("2. 超時時間要大于最長查詢時間");
        System.out.println("3. 空閑超時要平衡資源利用和連接創(chuàng)建開銷");
        System.out.println("4. 生命周期要小于數(shù)據(jù)庫連接超時");
    }
}

經(jīng)驗教訓:
不要盲目相信"最佳實踐",要結合自己的實際情況
調(diào)優(yōu)是個漸進的過程,不要一次改太多參數(shù)
每次調(diào)整都要有數(shù)據(jù)支撐,不要憑感覺
記錄調(diào)優(yōu)過程和結果,方便后續(xù)參考

五、總結

如果把數(shù)據(jù)庫訪問比喻成在辦公室飲水:不要隨時隨地都去打井取水(建立臨時連接),而是提前準備好整齊的水杯(連接池)備用。

在 Spring Boot + KingbaseES 中,HikariCP 就像高性能新式飲水機,是首選的連接池實現(xiàn);

Druid 相比之下更像帶有大屏幕監(jiān)控功能的智能型水壺,可以監(jiān)視水量和過濾雜質(zhì),更適合需要可視化監(jiān)控和審計的團隊;

相比之下,DBCP 和 C3P0 更像傳統(tǒng)型水壺,如果歷史原因無法升級,暫時可以繼續(xù)使用,但不再推薦投入資源進行升級。

真正的優(yōu)化不在于簡單地準備越多的水杯,而是需要事先研究高峰期人流量和平均消耗時間,精準設計水杯數(shù)以確保不虛不漏;同時關注慢查詢和長時占用連接的情況,及時清理“牽掛不放”的水杯。簡而言之:首先選擇優(yōu)秀的連接池實現(xiàn)(推薦 HikariCP),如果需要可視化,可以考慮 Druid;然后進行詳細規(guī)劃、持續(xù)監(jiān)測指標和優(yōu)化,這樣系統(tǒng)既可靠又高效。

到此這篇關于Spring Boot + KingbaseES 連接池實戰(zhàn)的文章就介紹到這了,更多相關Spring Boot KingbaseES 連接池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用枚舉替代if/else和switch-case語句的實踐

    Java使用枚舉替代if/else和switch-case語句的實踐

    在軟件開發(fā)中if-else和switch-case語句經(jīng)常被用來處理不同的條件分支,但在大型項目中,這種做法可能導致代碼可讀性差、維護困難,這篇文章主要給大家介紹了關于Java使用枚舉替代if/else和switch-case語句的相關資料,需要的朋友可以參考下
    2024-09-09
  • Spring?Security自定義AuthenticationManager實現(xiàn)手機號/密碼雙認證

    Spring?Security自定義AuthenticationManager實現(xiàn)手機號/密碼雙認證

    這篇文章給大家介紹了Spring?Security自定義AuthenticationManager實現(xiàn)手機號/密碼雙認證,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2026-06-06
  • 利用Log4j將不同Package的日志輸出到不同文件的方法

    利用Log4j將不同Package的日志輸出到不同文件的方法

    日志是應用軟件中不可缺少的部分,Apache的開源項目log4j是一個功能強大的日志組件,提供方便的日志記錄。這篇文章主要介紹了利用Log4j將不同Package的日志輸出到不同文件的方法,需要的朋友可以參考借鑒,下面來跟著小編一起學習學習吧。
    2017-01-01
  • Java常見的轉義字符舉例詳解

    Java常見的轉義字符舉例詳解

    在java字符常量中,反斜杠(\)是一個特殊的字符,被稱為轉義字符,它的作用是用來轉義后面一個字符,這篇文章主要給大吉介紹了關于Java常見轉義字符的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • SparkSQL開窗函數(shù)分析使用示例

    SparkSQL開窗函數(shù)分析使用示例

    開窗函數(shù)的引入是為了既顯示聚集前的數(shù)據(jù),又顯示聚集后的數(shù)據(jù)。即在每一行的最后一列添加聚合函數(shù)的結果。開窗用于為行定義一個窗口,它對一組值進行操作,不需要使用 GROUP BY 子句對數(shù)據(jù)進行分組,能夠在同一行中同時返回基礎行的列和聚合列
    2023-01-01
  • SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法

    SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法

    這篇文章主要介紹了SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 帶你快速搞定java并發(fā)庫

    帶你快速搞定java并發(fā)庫

    本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價值。下面跟著小編一起來看下吧,希望能給你帶來幫助
    2021-07-07
  • Spring Boot 使用 WebServiceTemplate 調(diào)用 WebService的完整步驟

    Spring Boot 使用 WebServiceTemplate 調(diào)用&nbs

    文章介紹了使用Spring WebServiceTemplate調(diào)用WebService的方法,包括添加依賴、配置WebServiceTemplate、編寫調(diào)用工具類、注意事項及完整的調(diào)用步驟,特別強調(diào)了調(diào)用.NET的WebService需要添加SOAPAction請求頭,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Java中CountDownLatch進行多線程同步詳解及實例代碼

    Java中CountDownLatch進行多線程同步詳解及實例代碼

    這篇文章主要介紹了Java中CountDownLatch進行多線程同步詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • JMS 之 Active MQ 的消息傳輸(詳解)

    JMS 之 Active MQ 的消息傳輸(詳解)

    下面小編就為大家?guī)硪黄狫MS 之 Active MQ 的消息傳輸(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論

禹州市| 潜山县| 汝州市| 辽阳县| 浏阳市| 察雅县| 平定县| 福海县| 建阳市| 凯里市| 江达县| 日土县| 玛纳斯县| 宁明县| 永寿县| 辽阳县| 修水县| 定兴县| 南华县| 泸定县| 古蔺县| 沛县| 北辰区| 萍乡市| 渭南市| 正宁县| 南昌市| 莱西市| 永靖县| 麦盖提县| 新沂市| 自治县| 时尚| 龙山县| 平谷区| 罗甸县| 康定县| 衢州市| 崇阳县| 隆德县| 陇南市|