HikariCP連接池:高性能Java數(shù)據(jù)庫(kù)連接管理原理與實(shí)戰(zhàn)配置
1. 從“連接”說(shuō)起為什么我們需要連接池如果你寫(xiě)過(guò)任何需要和數(shù)據(jù)庫(kù)打交道的Java應(yīng)用那么對(duì)DriverManager.getConnection()這行代碼一定不陌生。這行代碼的職責(zé)很簡(jiǎn)單建立一條從你的應(yīng)用進(jìn)程到數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)絡(luò)連接。在早期的學(xué)習(xí)或者簡(jiǎn)單的Demo里我們可能隨手就在方法里創(chuàng)建連接用完了再close()掉。這看起來(lái)沒(méi)什么問(wèn)題對(duì)吧但當(dāng)你把應(yīng)用部署到生產(chǎn)環(huán)境面對(duì)每秒成百上千的請(qǐng)求時(shí)問(wèn)題就來(lái)了。想象一下每個(gè)請(qǐng)求都要重復(fù)“建立TCP連接 - 數(shù)據(jù)庫(kù)認(rèn)證 - 執(zhí)行SQL - 關(guān)閉連接”這個(gè)完整流程。建立連接尤其是TLS加密連接和數(shù)據(jù)庫(kù)的登錄認(rèn)證是極其消耗資源和時(shí)間的操作通常需要幾十到幾百毫秒。而實(shí)際執(zhí)行一個(gè)簡(jiǎn)單的查詢可能只需要幾毫秒。這意味著大部分時(shí)間都浪費(fèi)在了“握手”和“告別”上數(shù)據(jù)庫(kù)服務(wù)器也會(huì)疲于應(yīng)付海量的連接創(chuàng)建和銷(xiāo)毀請(qǐng)求最終導(dǎo)致應(yīng)用響應(yīng)變慢數(shù)據(jù)庫(kù)負(fù)載飆升整個(gè)系統(tǒng)陷入性能泥潭。連接池Connection Pool就是為了解決這個(gè)問(wèn)題而生的。它的核心思想是“復(fù)用”。在應(yīng)用啟動(dòng)時(shí)連接池就預(yù)先建立好一定數(shù)量的數(shù)據(jù)庫(kù)連接并將它們維護(hù)在一個(gè)“池子”里。當(dāng)應(yīng)用需要操作數(shù)據(jù)庫(kù)時(shí)不是去創(chuàng)建新連接而是從池子里“借”一個(gè)現(xiàn)成的、已經(jīng)建立好的連接來(lái)用。用完之后不是真的關(guān)閉它而是將它“還”回池子里留給下一個(gè)請(qǐng)求使用。這樣一來(lái)連接的生命周期被大大延長(zhǎng)昂貴的建立和銷(xiāo)毀開(kāi)銷(xiāo)被均攤到了所有請(qǐng)求上系統(tǒng)性能得到質(zhì)的提升。在Java生態(tài)中連接池的實(shí)現(xiàn)有很多從上古時(shí)代的Apache DBCP到曾經(jīng)非常流行的C3P0再到后來(lái)居上的HikariCP。而今天我們要深入探討的HikariCP正是憑借其“快如閃電”Hikari在日語(yǔ)中意為“光”的性能和極簡(jiǎn)的設(shè)計(jì)哲學(xué)成為了當(dāng)今Java領(lǐng)域事實(shí)上的默認(rèn)連接池選擇是Spring Boot 2.x及以后版本的默認(rèn)內(nèi)置連接池。理解HikariCP不僅是掌握一個(gè)工具更是理解高性能Java應(yīng)用架構(gòu)的一個(gè)基礎(chǔ)環(huán)節(jié)。2. HikariCP 設(shè)計(jì)哲學(xué)為什么是“光”HikariCP的誕生并非偶然它的作者Brett Wooldridge對(duì)當(dāng)時(shí)主流的連接池如C3P0、Tomcat JDBC Pool進(jìn)行了深刻的反思。他發(fā)現(xiàn)這些連接池在追求功能豐富性的同時(shí)引入了大量不必要的復(fù)雜性導(dǎo)致性能損耗和潛在的不穩(wěn)定性。HikariCP的設(shè)計(jì)哲學(xué)可以概括為極致簡(jiǎn)單、極致性能、零開(kāi)銷(xiāo)。2.1 與“前輩”們的核心差異為了理解HikariCP的“快”我們可以先看看傳統(tǒng)連接池的一些常見(jiàn)“包袱”動(dòng)態(tài)代理的濫用很多連接池為了實(shí)現(xiàn)對(duì)連接的增強(qiáng)如攔截close方法將其改為“歸還”會(huì)使用動(dòng)態(tài)代理如JDK Proxy或CGLIB來(lái)包裝原始的Connection對(duì)象。每次創(chuàng)建代理都會(huì)產(chǎn)生額外的字節(jié)碼生成和反射調(diào)用開(kāi)銷(xiāo)。大量同步鎖為了線程安全地管理池中的連接傳統(tǒng)實(shí)現(xiàn)可能會(huì)在關(guān)鍵路徑上使用重量級(jí)鎖如synchronized在高并發(fā)下容易成為瓶頸。冗余的功能堆砌例如連接有效性檢查validationQuery策略復(fù)雜、連接泄露檢測(cè)機(jī)制臃腫等這些功能本身是好的但實(shí)現(xiàn)方式不夠高效。HikariCP針對(duì)這些問(wèn)題進(jìn)行了外科手術(shù)式的優(yōu)化無(wú)動(dòng)態(tài)代理HikariCP創(chuàng)造性地使用了javassist字節(jié)碼庫(kù)在類(lèi)加載期就生成了高度優(yōu)化的、靜態(tài)的代理類(lèi)。這意味著運(yùn)行時(shí)獲取連接、調(diào)用方法幾乎就是直接調(diào)用沒(méi)有任何反射開(kāi)銷(xiāo)。這是其性能飛躍的關(guān)鍵之一。自定義無(wú)鎖集合HikariCP自己實(shí)現(xiàn)了一個(gè)名為ConcurrentBag的高并發(fā)容器來(lái)存儲(chǔ)連接。它借鑒了java.util.concurrent包中的無(wú)鎖思想針對(duì)連接池“借”和“還”的高頻操作進(jìn)行了極致優(yōu)化大幅減少了線程競(jìng)爭(zhēng)。極簡(jiǎn)的代碼庫(kù)HikariCP的源代碼非常精煉核心jar包體積很小。這減少了加載時(shí)間也意味著更少的Bug和更高的可維護(hù)性?!按a越少出錯(cuò)的機(jī)會(huì)越少”是其信條。2.2 性能數(shù)據(jù)背后的故事官方和社區(qū)的基準(zhǔn)測(cè)試反復(fù)證明HikariCP在幾乎所有場(chǎng)景下都顯著快于其他連接池。這個(gè)“快”體現(xiàn)在兩個(gè)維度獲取/歸還連接的速度即DataSource.getConnection()和Connection.close()的耗時(shí)。HikariCP通常能達(dá)到微秒級(jí)。整體系統(tǒng)吞吐量在高并發(fā)下使用HikariCP的應(yīng)用能支撐更高的QPS并且延遲更低、更穩(wěn)定。這種性能優(yōu)勢(shì)在微服務(wù)架構(gòu)和云原生環(huán)境下價(jià)值巨大。當(dāng)你的一個(gè)用戶請(qǐng)求可能需要串行或并行調(diào)用多個(gè)微服務(wù)每個(gè)服務(wù)又可能需要多次訪問(wèn)數(shù)據(jù)庫(kù)時(shí)連接獲取的微小延遲累積起來(lái)就會(huì)變得非??捎^。HikariCP在這方面的卓越表現(xiàn)使其成為構(gòu)建高性能響應(yīng)式系統(tǒng)的基石組件。3. 核心配置詳解不僅僅是設(shè)置幾個(gè)參數(shù)雖然HikariCP以“開(kāi)箱即用”著稱(chēng)其默認(rèn)配置已經(jīng)適用于大多數(shù)場(chǎng)景但理解其核心配置項(xiàng)對(duì)于應(yīng)對(duì)復(fù)雜生產(chǎn)環(huán)境至關(guān)重要。配置不僅僅是填參數(shù)更是對(duì)你應(yīng)用行為和數(shù)據(jù)庫(kù)負(fù)載的一種聲明和規(guī)劃。3.1 基礎(chǔ)連接池參數(shù)這些參數(shù)定義了連接池的靜態(tài)規(guī)模和基本行為。maximumPoolSize連接池最大連接數(shù)。這是最重要的參數(shù)之一沒(méi)有“銀彈”值。設(shè)置過(guò)大會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器內(nèi)存和線程資源緊張?jiān)O(shè)置過(guò)小則無(wú)法充分利用數(shù)據(jù)庫(kù)并發(fā)處理能力導(dǎo)致請(qǐng)求排隊(duì)。經(jīng)驗(yàn)公式一個(gè)常見(jiàn)的起點(diǎn)是maximumPoolSize (核心數(shù) * 2) 有效磁盤(pán)數(shù)。但這只是個(gè)參考。更科學(xué)的方式是基于實(shí)際壓測(cè)觀察在目標(biāo)TPS下數(shù)據(jù)庫(kù)的CPU使用率和連接數(shù)找到一個(gè)使數(shù)據(jù)庫(kù)資源利用率如CPU在70%-80%和響應(yīng)時(shí)間都達(dá)到平衡的值。對(duì)于Web應(yīng)用通常建議在10到50之間。minimumIdle連接池中保持的最小空閑連接數(shù)。HikariCP為了追求極致性能默認(rèn)將其設(shè)置為與maximumPoolSize相同即池子一旦滿員就不會(huì)主動(dòng)收縮。這意味著連接池在啟動(dòng)后很快就會(huì)建立最大數(shù)量的連接并一直維持。如果你的應(yīng)用流量有明顯的波峰波谷如白天高、夜間低這可能會(huì)造成數(shù)據(jù)庫(kù)連接資源的浪費(fèi)。此時(shí)你可以將minimumIdle設(shè)置為一個(gè)較小的值如5或10并允許連接池收縮。connectionTimeout客戶端從連接池獲取連接的最大等待時(shí)間毫秒。如果在這個(gè)時(shí)間內(nèi)無(wú)法獲取到連接比如所有連接都在忙且池已滿則會(huì)拋出SQLTimeoutException。默認(rèn)是30秒30000ms對(duì)于大多數(shù)OLTP應(yīng)用來(lái)說(shuō)太長(zhǎng)了建議設(shè)置為2-5秒。這有助于快速失敗避免請(qǐng)求線程被長(zhǎng)時(shí)間掛起導(dǎo)致雪崩。idleTimeout連接在池中空閑多久后會(huì)被釋放毫秒。僅在minimumIdle maximumPoolSize時(shí)生效。默認(rèn)10分鐘600000ms。如果你的應(yīng)用有長(zhǎng)時(shí)間的低谷期可以適當(dāng)調(diào)低此值以釋放數(shù)據(jù)庫(kù)資源。maxLifetime一個(gè)連接在池中的最長(zhǎng)生命周期毫秒。即使連接是健康的超過(guò)這個(gè)時(shí)間后在它被歸還到池里時(shí)也會(huì)被關(guān)閉。這有助于應(yīng)對(duì)一些網(wǎng)絡(luò)層面或數(shù)據(jù)庫(kù)端的“僵死”連接問(wèn)題。默認(rèn)30分鐘1800000ms。對(duì)于非常穩(wěn)定的數(shù)據(jù)庫(kù)環(huán)境可以適當(dāng)延長(zhǎng)對(duì)于云數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)不穩(wěn)定的環(huán)境可以保持或縮短。3.2 連接健康與可靠性配置數(shù)據(jù)庫(kù)連接不是一勞永逸的網(wǎng)絡(luò)閃斷、數(shù)據(jù)庫(kù)重啟、防火墻超時(shí)都可能使一個(gè)池內(nèi)的連接失效。HikariCP提供了精細(xì)化的健康檢查機(jī)制。connectionTestQuery在從池中取出連接交給應(yīng)用之前執(zhí)行一個(gè)簡(jiǎn)單的查詢來(lái)測(cè)試連接是否有效。對(duì)于支持JDBC4Connection.isValid()方法的驅(qū)動(dòng)如MySQL Connector/J 5.0.5 PostgreSQL JDBC 42強(qiáng)烈建議不要設(shè)置此參數(shù)。因?yàn)閕sValid()是驅(qū)動(dòng)原生提供的、最高效的檢查方式。如果你使用的驅(qū)動(dòng)太老不支持才需要設(shè)置一個(gè)像SELECT 1這樣的查詢。validationTimeout連接有效性檢查的超時(shí)時(shí)間毫秒。必須小于connectionTimeout。默認(rèn)5秒。leakDetectionThreshold連接泄露檢測(cè)閾值毫秒。如果一個(gè)連接被應(yīng)用“借走”后超過(guò)這個(gè)時(shí)間仍未“歸還”HikariCP會(huì)認(rèn)為它可能泄露了并在日志中輸出警告但不會(huì)主動(dòng)關(guān)閉它。這是一個(gè)事后診斷工具對(duì)于發(fā)現(xiàn)未正確關(guān)閉連接如在try-with-resources塊外使用連接的Bug非常有用。生產(chǎn)環(huán)境可以設(shè)置為一個(gè)較大的值如5分鐘300000ms開(kāi)發(fā)環(huán)境可以設(shè)小一點(diǎn)如10秒以便快速發(fā)現(xiàn)問(wèn)題。注意很多初學(xué)者會(huì)混淆connectionTestQuery和leakDetectionThreshold。前者是“借出前”的健康檢查確保給應(yīng)用的是好連接后者是“借出后”的監(jiān)控用于發(fā)現(xiàn)應(yīng)用層的Bug。3.3 一個(gè)完整的配置示例基于Spring Boot在Spring Boot中配置HikariCP非常直觀。以下是一個(gè)application.yml的配置示例并附上了詳細(xì)注釋spring: datasource: url: jdbc:mysql://localhost:3306/your_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: your_user password: your_password driver-class-name: com.mysql.cj.jdbc.Driver hikari: # 連接池大小 maximum-pool-size: 20 # 根據(jù)你的應(yīng)用和數(shù)據(jù)庫(kù)調(diào)整 minimum-idle: 5 # 允許連接池在空閑時(shí)收縮 # 連接獲取與生命周期 connection-timeout: 3000 # 3秒內(nèi)獲取不到連接就快速失敗 idle-timeout: 600000 # 空閑10分鐘釋放 max-lifetime: 1800000 # 連接最長(zhǎng)存活30分鐘 # 連接健康檢查 (使用JDBC4驅(qū)動(dòng)無(wú)需設(shè)置connection-test-query) validation-timeout: 5000 # 連接泄露檢測(cè) (生產(chǎn)環(huán)境建議開(kāi)啟) leak-detection-threshold: 300000 # 連接被占用5分鐘未歸還則記錄警告 # 其他優(yōu)化項(xiàng) connection-init-sql: SET NAMES utf8mb4 # 連接創(chuàng)建后執(zhí)行的初始化SQL可選 read-only: false transaction-isolation: TRANSACTION_READ_COMMITTED # 默認(rèn)事務(wù)隔離級(jí)別可選 # 連接自定義屬性會(huì)傳遞給JDBC驅(qū)動(dòng) >指標(biāo)含義健康狀態(tài)參考activeConnections當(dāng)前被應(yīng)用使用的連接數(shù)應(yīng)長(zhǎng)期低于maximumPoolSize。如果持續(xù)接近或等于最大值說(shuō)明連接池可能成為瓶頸。idleConnections池中空閑的連接數(shù)idle active totalConnections??臻e連接過(guò)多可能意味著maximumPoolSize設(shè)大了。totalConnections池中總連接數(shù)活躍空閑應(yīng)在minimumIdle和maximumPoolSize之間。threadsAwaitingConnection正在等待獲取連接的線程數(shù)這是最重要的預(yù)警指標(biāo)。如果這個(gè)值持續(xù)大于0說(shuō)明連接池已經(jīng)滿載請(qǐng)求開(kāi)始排隊(duì)。需要立刻檢查是否有慢查詢、連接泄露或考慮調(diào)大maximumPoolSize。connectionTimeout連接獲取超時(shí)次數(shù)如果持續(xù)增長(zhǎng)說(shuō)明大量請(qǐng)求無(wú)法及時(shí)獲取連接系統(tǒng)可能已過(guò)載或配置不當(dāng)。建議將這些指標(biāo)集成到你的APM如SkyWalking, Pinpoint或監(jiān)控系統(tǒng)如Prometheus Grafana中并設(shè)置告警規(guī)則例如threadsAwaitingConnection 5 持續(xù)1分鐘。4.2 性能調(diào)優(yōu)思路調(diào)優(yōu)沒(méi)有固定公式是一個(gè)“觀察 - 假設(shè) - 調(diào)整 - 驗(yàn)證”的循環(huán)。識(shí)別瓶頸首先通過(guò)監(jiān)控判斷瓶頸是否真的在連接池。如果數(shù)據(jù)庫(kù)CPU/IO很高或者應(yīng)用本身GC頻繁那么調(diào)整連接池可能收效甚微。調(diào)整maximumPoolSize場(chǎng)景AactiveConnections持續(xù)接近maximumPoolSize且threadsAwaitingConnection很高。可能原因連接數(shù)不足。行動(dòng)嘗試適當(dāng)增加maximumPoolSize比如增加20%觀察數(shù)據(jù)庫(kù)負(fù)載是否可接受以及等待線程數(shù)是否下降。場(chǎng)景BactiveConnections不高但totalConnections一直維持在maximumPoolSize且數(shù)據(jù)庫(kù)連接數(shù)很多。可能原因連接數(shù)設(shè)置過(guò)大數(shù)據(jù)庫(kù)維護(hù)多余連接有開(kāi)銷(xiāo)。行動(dòng)嘗試適當(dāng)降低maximumPoolSize和minimumIdle。優(yōu)化連接生命周期如果數(shù)據(jù)庫(kù)位于云端或網(wǎng)絡(luò)不穩(wěn)定可以適當(dāng)縮短maxLifetime如10-15分鐘讓連接定期更新避免使用可能已失效的“老”連接。同時(shí)確保idleTimeout生效minimumIdle要小于maximumPoolSize以在業(yè)務(wù)低峰期釋放資源。驅(qū)動(dòng)層面優(yōu)化如上面配置示例所示充分利用JDBC驅(qū)動(dòng)的高級(jí)特性如MySQL的預(yù)處理語(yǔ)句緩存cachePrepStmts可以大幅提升性能這比單純調(diào)整連接池參數(shù)效果更顯著。4.3 常見(jiàn)問(wèn)題排查實(shí)錄問(wèn)題現(xiàn)象應(yīng)用運(yùn)行一段時(shí)間后日志中出現(xiàn)大量Connection is not available, request timed out after 3000ms異常隨后服務(wù)幾乎不可用。排查鏈路第一步檢查即時(shí)監(jiān)控。立刻查看threadsAwaitingConnection和activeConnections。假設(shè)發(fā)現(xiàn)activeConnections maximumPoolSize 20且threadsAwaitingConnection有數(shù)十個(gè)。這說(shuō)明所有連接都被占用且請(qǐng)求在排隊(duì)。第二步分析連接被誰(shuí)占用。連接被占用無(wú)非是應(yīng)用正在使用它執(zhí)行SQL。此時(shí)需要排查慢查詢立刻查詢數(shù)據(jù)庫(kù)的當(dāng)前活躍會(huì)話如MySQL的SHOW PROCESSLIST看看是否有執(zhí)行時(shí)間非常長(zhǎng)的SQL。一個(gè)慢查詢占用一個(gè)連接如果這樣的慢查詢有多個(gè)很快就會(huì)耗盡連接池。連接泄露檢查應(yīng)用日志中是否有HikariCP打印的Connection leak detection警告。如果有說(shuō)明有代碼段借了連接但沒(méi)有歸還比如在try-catch塊中獲取了連接但在異常處理路徑中忘記關(guān)閉。使用leakDetectionThreshold可以幫助快速定位這類(lèi)問(wèn)題的代碼位置。事務(wù)未提交/回滾檢查是否有長(zhǎng)時(shí)間未提交的事務(wù)可能是編程錯(cuò)誤或者邏輯復(fù)雜導(dǎo)致事務(wù)跨度太長(zhǎng)。長(zhǎng)事務(wù)會(huì)一直持有數(shù)據(jù)庫(kù)連接。第三步針對(duì)性解決。如果是慢查詢需要優(yōu)化SQL語(yǔ)句、檢查索引、分析業(yè)務(wù)邏輯。如果是連接泄露修復(fù)代碼確保所有數(shù)據(jù)庫(kù)操作都在try-with-resources語(yǔ)句塊中或是在finally塊中正確關(guān)閉連接。如果是長(zhǎng)事務(wù)審視業(yè)務(wù)邏輯拆分大事務(wù)或調(diào)整事務(wù)邊界。第四步臨時(shí)緩解與根治。在找到根本原因并修復(fù)之前可以臨時(shí)、小幅地增加maximumPoolSize作為緩沖。但切記這只是一個(gè)臨時(shí)方案根本原因不解決增加連接池大小只是延緩了問(wèn)題爆發(fā)的時(shí)間并且可能將壓力轉(zhuǎn)移到數(shù)據(jù)庫(kù)導(dǎo)致更嚴(yán)重的雪崩。另一個(gè)典型坑連接有效性檢查validationQuery的誤用很多從舊連接池遷移過(guò)來(lái)的配置會(huì)習(xí)慣性地加上connectionTestQuery: SELECT 1。在支持JDBC4的現(xiàn)代驅(qū)動(dòng)下這會(huì)產(chǎn)生反效果額外網(wǎng)絡(luò)往返SELECT 1需要一次完整的數(shù)據(jù)庫(kù)請(qǐng)求-響應(yīng)。與isValid()沖突HikariCP默認(rèn)會(huì)優(yōu)先使用isValid()這是一個(gè)驅(qū)動(dòng)內(nèi)部的輕量級(jí)檢查。如果你配置了connectionTestQueryHikariCP反而會(huì)使用這個(gè)更重的方式。可能掩蓋問(wèn)題SELECT 1能通過(guò)不代表連接真的能執(zhí)行業(yè)務(wù)SQL例如會(huì)話變量被改變、臨時(shí)表存在等問(wèn)題。正確做法移除connectionTestQuery配置讓HikariCP使用默認(rèn)的、更高效的isValid()方法。確保你使用的JDBC驅(qū)動(dòng)版本足夠新。5. 進(jìn)階話題HikariCP 在云原生與微服務(wù)下的思考在現(xiàn)代架構(gòu)中HikariCP的使用也需要一些新的考量。彈性伸縮與連接池在Kubernetes環(huán)境中應(yīng)用Pod可能會(huì)頻繁地創(chuàng)建和銷(xiāo)毀。HikariCP的minimumIdle策略可能導(dǎo)致在應(yīng)用啟動(dòng)初期就向數(shù)據(jù)庫(kù)發(fā)起大量連接請(qǐng)求形成“連接風(fēng)暴”對(duì)數(shù)據(jù)庫(kù)造成沖擊。一種策略是采用更激進(jìn)的minimumIdle比如設(shè)為0并配合較短的connectionTimeout讓連接池按需、緩慢地建立連接。同時(shí)數(shù)據(jù)庫(kù)端也應(yīng)配置合理的連接數(shù)和超時(shí)設(shè)置。多數(shù)據(jù)源與讀寫(xiě)分離在讀寫(xiě)分離場(chǎng)景中你可能會(huì)配置多個(gè)DataSource分別指向主庫(kù)和從庫(kù)。Spring Boot提供了良好的支持如AbstractRoutingDataSource。需要注意的是每個(gè)數(shù)據(jù)源都會(huì)有一個(gè)獨(dú)立的HikariCP連接池。你需要根據(jù)主庫(kù)寫(xiě)多和從庫(kù)讀多的不同壓力模式分別配置它們的maximumPoolSize、connectionTimeout等參數(shù)。通常讀池可以設(shè)置得比寫(xiě)池更大。與響應(yīng)式編程的配合在Spring WebFlux等響應(yīng)式棧中傳統(tǒng)的阻塞式JDBC和連接池包括HikariCP會(huì)成為瓶頸因?yàn)轫憫?yīng)式編程的核心是非阻塞。對(duì)于全鏈路響應(yīng)式應(yīng)用應(yīng)考慮使用R2DBC響應(yīng)式關(guān)系數(shù)據(jù)庫(kù)連接及其對(duì)應(yīng)的連接池如R2DBC Pool。然而在大量的現(xiàn)有項(xiàng)目和部分使用場(chǎng)景中基于HikariCP的阻塞式數(shù)據(jù)訪問(wèn)仍然是主流且高效的選擇特別是在處理復(fù)雜事務(wù)或與大量現(xiàn)有ORM如MyBatis框架集成時(shí)。HikariCP的成功在于它精準(zhǔn)地抓住了“數(shù)據(jù)庫(kù)連接管理”這個(gè)核心問(wèn)題的本質(zhì)并用一種近乎偏執(zhí)的簡(jiǎn)潔和高效的方式解決了它。它不是一個(gè)功能大而全的“瑞士軍刀”而是一把精心打磨、鋒利無(wú)比的“手術(shù)刀”。理解它的原理合理地配置和監(jiān)控它能讓你的Java應(yīng)用在數(shù)據(jù)訪問(wèn)層打下堅(jiān)實(shí)、高性能的基礎(chǔ)。在實(shí)際使用中我最大的體會(huì)是信任它的默認(rèn)配置但一定要理解這些默認(rèn)值背后的含義不要盲目調(diào)參讓監(jiān)控?cái)?shù)據(jù)告訴你該怎么做。大多數(shù)時(shí)候問(wèn)題不出在HikariCP本身而出在我們對(duì)應(yīng)用行為、SQL效率以及數(shù)據(jù)庫(kù)狀態(tài)缺乏洞察。

相關(guān)新聞

C++桌面應(yīng)用系統(tǒng)通知開(kāi)發(fā)指南:WinToast庫(kù)集成與實(shí)戰(zhàn)

C++桌面應(yīng)用系統(tǒng)通知開(kāi)發(fā)指南:WinToast庫(kù)集成與實(shí)戰(zhàn)

1. 項(xiàng)目概述:為什么我們需要WinToast?如果你在Windows平臺(tái)上用C開(kāi)發(fā)桌面應(yīng)用,尤其是那些需要和用戶進(jìn)行輕量級(jí)、非阻塞交互的工具,比如一個(gè)下載完成提醒、一個(gè)后臺(tái)任務(wù)的狀態(tài)更新,或者一個(gè)即時(shí)通訊軟件的來(lái)新消息提示&…

2026/8/4 4:22:47 閱讀更多
Notion與AI代碼生成模型集成:構(gòu)建文檔即代碼環(huán)境實(shí)踐指南

Notion與AI代碼生成模型集成:構(gòu)建文檔即代碼環(huán)境實(shí)踐指南

如果你最近在關(guān)注 AI 助手領(lǐng)域,可能會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:一邊是 Notion AI 作為“筆記管家”深入人心,另一邊是 Cursor、Claude 等“代碼專(zhuān)家”在開(kāi)發(fā)者中口碑爆棚。但有沒(méi)有一種可能,我們真正需要的不是一個(gè)“管家”或一個(gè)“專(zhuān)家…

2026/8/4 4:12:47 閱讀更多
SpringAl 基本概念

SpringAl 基本概念

1. Chat Model(聊天模型)SpringAl 把不同廠商的大模型統(tǒng)一成一個(gè)接口。OpenAL GptAnthropic ClaudeGoogle GeminiDeepSeek通義千問(wèn)Ollama本地模型以前java:OpenAI API Claude API DeepSeek API現(xiàn)在:ChatModel統(tǒng)一調(diào)用:String result chatCli…

2026/8/4 4:12:47 閱讀更多
海量異構(gòu)增量同步困境破局:KFS 全鏈路并行同步實(shí)戰(zhàn)

海量異構(gòu)增量同步困境破局:KFS 全鏈路并行同步實(shí)戰(zhàn)

海量異構(gòu)增量同步困境破局:KFS全鏈路并行同步實(shí)戰(zhàn)前言 隨著業(yè)務(wù)數(shù)據(jù)爆發(fā)式增長(zhǎng),大量企業(yè)正在進(jìn)行數(shù)據(jù)庫(kù)國(guó)產(chǎn)化遷移、多源數(shù)據(jù)匯聚、異地災(zāi)備建設(shè)。傳統(tǒng)CDC同步工具普遍采用單線程串行解析、串行入庫(kù)架構(gòu),一旦業(yè)務(wù)增量上漲,很容易出…

2026/8/4 5:22:49 閱讀更多
構(gòu)網(wǎng)型VSG-PMSM風(fēng)力發(fā)電系統(tǒng)仿真與動(dòng)態(tài)特性研究

構(gòu)網(wǎng)型VSG-PMSM風(fēng)力發(fā)電系統(tǒng)仿真與動(dòng)態(tài)特性研究

1. 項(xiàng)目概述:構(gòu)網(wǎng)型VSG-PMSM風(fēng)力發(fā)電系統(tǒng)仿真研究最近在電力電子圈子里,構(gòu)網(wǎng)型逆變器技術(shù)越來(lái)越火,特別是在新能源發(fā)電領(lǐng)域。這次我要分享的是一個(gè)基于虛擬同步發(fā)電機(jī)(VSG)控制的永磁同步電機(jī)(PMSM)直驅(qū)風(fēng)力發(fā)電系統(tǒng)仿真項(xiàng)目,重點(diǎn)…

2026/8/4 5:22:49 閱讀更多
Python Pandas實(shí)現(xiàn)Excel財(cái)務(wù)分賬自動(dòng)化處理

Python Pandas實(shí)現(xiàn)Excel財(cái)務(wù)分賬自動(dòng)化處理

1. 為什么需要自動(dòng)化分賬處理?財(cái)務(wù)分賬是許多行業(yè)中的高頻剛需場(chǎng)景。以電商平臺(tái)為例,每月需要根據(jù)銷(xiāo)售數(shù)據(jù)計(jì)算數(shù)百位分銷(xiāo)商的傭金;教育培訓(xùn)機(jī)構(gòu)要按課時(shí)統(tǒng)計(jì)講師的課酬;線下零售連鎖店需匯總各門(mén)店銷(xiāo)售額并計(jì)算店長(zhǎng)提成。這些場(chǎng)景…

2026/8/4 5:22:49 閱讀更多
嵌入式USBTMC設(shè)備端驅(qū)動(dòng)開(kāi)發(fā):從協(xié)議解析到實(shí)戰(zhàn)調(diào)試

嵌入式USBTMC設(shè)備端驅(qū)動(dòng)開(kāi)發(fā):從協(xié)議解析到實(shí)戰(zhàn)調(diào)試

1. 從一次調(diào)試失敗說(shuō)起:為什么USBTMC設(shè)備端驅(qū)動(dòng)值得深究最近在調(diào)試一個(gè)自研的測(cè)量?jī)x器時(shí),遇到了一個(gè)讓人頭疼的問(wèn)題。儀器通過(guò)USB連接到一臺(tái)運(yùn)行Linux的工控機(jī)上,上位機(jī)軟件使用的是標(biāo)準(zhǔn)的VISA庫(kù),按理說(shuō)應(yīng)該即插即用。但實(shí)際情況是…

2026/8/4 5:22:49 閱讀更多
Avidemux視頻編輯完全指南:5個(gè)實(shí)用技巧讓你輕松上手

Avidemux視頻編輯完全指南:5個(gè)實(shí)用技巧讓你輕松上手

Avidemux視頻編輯完全指南:5個(gè)實(shí)用技巧讓你輕松上手 【免費(fèi)下載鏈接】avidemux2 Avidemux2, simple video editor 項(xiàng)目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款功能強(qiáng)大的開(kāi)源視頻編輯軟件,專(zhuān)為L(zhǎng)inux、Windows和macOS…

2026/8/4 5:22:49 閱讀更多
FTP協(xié)議詳解:從基礎(chǔ)原理到企業(yè)級(jí)應(yīng)用實(shí)踐

FTP協(xié)議詳解:從基礎(chǔ)原理到企業(yè)級(jí)應(yīng)用實(shí)踐

1. FTP協(xié)議基礎(chǔ)解析FTP(File Transfer Protocol)作為最古老的文件傳輸協(xié)議之一,自1971年誕生以來(lái)一直是網(wǎng)絡(luò)文件交換的基石。我在實(shí)際運(yùn)維工作中發(fā)現(xiàn),盡管HTTP和云存儲(chǔ)日益普及,但FTP在內(nèi)部文件共享、自動(dòng)化傳輸?shù)葓?chǎng)景…

2026/8/4 5:12:49 閱讀更多
清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

通訊作者:鄧兵、劉建國(guó)通訊單位:清華大學(xué)DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清潔能源技術(shù)與電子器件不可或缺的核心原料,然而傳統(tǒng)提取方式依賴(lài)能耗高、排放大的采礦與強(qiáng)…

2026/8/4 0:01:30 閱讀更多
貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

研究背景質(zhì)子交換膜燃料電池(PEMFCs)因其高能量轉(zhuǎn)換效率和清潔零排放特性備受關(guān)注,然而陰極氧還原反應(yīng)(ORR)動(dòng)力學(xué)遲緩、鉑催化劑成本高昂且耐久性不足的問(wèn)題嚴(yán)重制約了其商業(yè)化進(jìn)程。將 Pt 與 3d 過(guò)渡金屬合金化可調(diào)控…

2026/8/4 0:01:30 閱讀更多
福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

通訊作者:萬(wàn)宇馳、張久俊、呂瑞濤通訊單位:福州大學(xué) 、清華大學(xué)DOI:https://doi.org/10.1002/adfm.76112核心導(dǎo)讀:本文提出"分步升級(jí)"廢硝酸鹽處理新路線——利用廢水中的金屬離子經(jīng)快速焦耳熱(40V&#xff…

2026/8/4 0:01:30 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類(lèi)短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/3 7:44:46 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/3 12:53:38 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專(zhuān)用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/3 19:34:52 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/3 19:34:54 閱讀更多