SpringBoot連接KingbaseES數(shù)據(jù)庫(kù)連接池實(shí)戰(zhàn)指南
一、前言
在做企業(yè)級(jí)項(xiàng)目時(shí),我們常常一邊催進(jìn)度、一邊盯性能:頁(yè)面得快、接口得穩(wěn),背后最“默默無(wú)聞”卻又至關(guān)重要的那部分,往往就是數(shù)據(jù)庫(kù)連接管理。要是真到高峰期才現(xiàn)開(kāi)連接,應(yīng)用就像高鐵只剩一條候車(chē)通道 —— 堵,全線(xiàn)慢。于是,連接池這種“提前把通道鋪好、閘機(jī)開(kāi)好”的機(jī)制,就成了性能優(yōu)化的基本盤(pán)。
在國(guó)產(chǎn)數(shù)據(jù)庫(kù)里,KingbaseES這幾年在醫(yī)療,交通等對(duì)可靠性、合規(guī)性要求極高的場(chǎng)景里越用越多。很多團(tuán)隊(duì)在把原本的Oracle、PostgreSQL體系平滑遷移到KingbaseES之后,會(huì)立刻面臨一個(gè)現(xiàn)實(shí)問(wèn)題:到底選哪個(gè)連接池?DBCP老牌穩(wěn)健,C3 P0歷史悠久但偏重,Druid監(jiān)控維度豐富又接地氣,HikariCP主打“極致輕快”。本文就結(jié)合Spring Boot的真實(shí)開(kāi)發(fā)場(chǎng)景,把這四種主流方案的配置思路、適用特征與優(yōu)化要點(diǎn)一次講清,幫你少走彎路。
二、什么是數(shù)據(jù)庫(kù)連接池
簡(jiǎn)單說(shuō),數(shù)據(jù)庫(kù)連接池就是在程序真正“要水”之前,先把水桶排好、龍頭擰開(kāi),等你來(lái)接;而不是每次渴了再去打一趟井水。創(chuàng)建和關(guān)閉數(shù)據(jù)庫(kù)連接本身是昂貴的系統(tǒng)操作:握手、認(rèn)證、分配資源,步驟一個(gè)不能少。如果每個(gè)HTTP請(qǐng)求都臨時(shí)建連、用完就銷(xiāo)毀,系統(tǒng)資源就會(huì)被這些重復(fù)動(dòng)作消耗掉,吞吐量和響應(yīng)時(shí)間都會(huì)被拖慢。連接池的做法是:?jiǎn)?dòng)或空閑階段先準(zhǔn)備一批可用連接(最小池);高峰期可按規(guī)則擴(kuò)容(最大池);請(qǐng)求來(lái)時(shí)“借”一條,用完“還”回去;若有“壞桶”(失效連接),再做檢測(cè)和重建。結(jié)果是:響應(yīng)更穩(wěn)定、抖動(dòng)更小,還能通過(guò)統(tǒng)計(jì)與監(jiān)控為后續(xù)容量評(píng)估提供數(shù)據(jù)支撐。
三、SpringBoot + KingbaseES 環(huán)境準(zhǔn)備
三步心智模型:
- 加依賴(lài)(讓項(xiàng)目知道怎么連庫(kù))
- 填地址(告訴它去哪里、用誰(shuí)登錄)
- 驗(yàn)連通(啟動(dòng)時(shí)或?qū)憘€(gè)最小 SQL 探活)
3.1 加依賴(lài)(pom.xml)
最少必備 = JDBC + 驅(qū)動(dòng) + 選一個(gè)連接池(別全塞上,沖突或白占空間)。
<dependencies>
<!-- Spring JDBC 基礎(chǔ) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- KingbaseES 驅(qū)動(dòng)(版本鎖定,跟服務(wù)器一致) -->
<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 默認(rèn)) -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
</dependencies>
提示: 如果用 Spring Boot Starter,很多情況下不必單獨(dú)引 HikariCP,它已內(nèi)嵌。
3.2 基礎(chǔ)連接信息(application.yml)
一定核對(duì)四件套:地址 / 端口 / 庫(kù)名 / 賬號(hào)密碼 + 驅(qū)動(dòng)類(lèi)名。
kingbase: driver-class-name: com.kingbase8.Driver url: jdbc:kingbase8://127.0.0.1:54321/TEST username: SYSTEM password: SYSTEM
小建議:
生產(chǎn)別寫(xiě)死密碼 → 用環(huán)境變量或外部化配置(如:ENC、K8S Secret)
若多數(shù)據(jù)源,分前綴管理,別混在 spring.datasource 根層
四、四類(lèi)主流連接池實(shí)戰(zhàn)
DBCP: 老黃牛,穩(wěn)但不花哨。
C3 P0: 功能多,參數(shù)細(xì),適合“歷史復(fù)雜場(chǎng)景”兜底。
Druid: 自帶監(jiān)控 + SQL 防火墻,運(yùn)維愛(ài)。
HikariCP: 快、輕、現(xiàn)代、高并發(fā)友好。
4.1 DBCP(遷移型 / 傳統(tǒng)項(xiàng)目友好)
看點(diǎn):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
實(shí)際應(yīng)用示例
@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 C3 P0
核心參數(shù):
- acquireIncrement:不夠時(shí)一次加多少
- 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)會(huì)浪費(fèi)資源;查詢(xún)語(yǔ)句盡量輕。
4.3 Druid(生產(chǎn)推薦 + 可視化)
優(yōu)點(diǎn):SQL 監(jiān)控、慢 SQL、Wall 防注入、Web 控制臺(tái)一站式。
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;
}
}
控制臺(tái)路徑:/druid/index.html
賬號(hào)密碼務(wù)必生產(chǎn)自定義 + 限制 IP
4.4 HikariCP(SpringBoot默認(rèn) / 高性能首選)
特點(diǎn):?jiǎn)?dòng)快、延遲低、參數(shù)少、容錯(cuò)好。
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é)
如果把數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)想成辦公室喝水:別每次口渴才跑去打井(臨時(shí)建連接),而是先備好一排干凈水杯(連接池)。
在 Spring Boot + KingbaseES 里,HikariCP 就像那臺(tái)又快又省心的新式飲水機(jī),默認(rèn)首選;
Druid 像帶大屏的智能款,能看水量、過(guò)濾雜質(zhì)(監(jiān)控與防護(hù)),適合需要可視化和審計(jì)的團(tuán)隊(duì);
DBCP、C3 P0 則更像老設(shè)備,除非歷史原因暫時(shí)換不動(dòng),否則不用再投入。
真正的優(yōu)化不是把“杯子”堆得越多越好,而是先弄清高峰時(shí)有多少人會(huì)來(lái)、每個(gè)人平均用多久,然后設(shè)一個(gè)剛好撐得住又不浪費(fèi)的位置,再盯慢查詢(xún)和長(zhǎng)事務(wù),及時(shí)清理“卡著不放的杯子”。一句話(huà):先選對(duì)(優(yōu)先 Hikari,需監(jiān)控加 Druid),再測(cè)清楚,再精調(diào),持續(xù)看指標(biāo),系統(tǒng)就會(huì)既穩(wěn)又順。
到此這篇關(guān)于SpringBoot連接KingbaseES數(shù)據(jù)庫(kù)連接池實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)SpringBoot連接KingbaseES連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8加java10等于Java18的版本查看及特性詳解
這篇文章主要為大家介紹了Java?8加java10等于Java18的各個(gè)版本要點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
SpringDataJpa的@Query注解報(bào)錯(cuò)的解決
這篇文章主要介紹了SpringDataJpa的@Query注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
如何通過(guò)??低曉O(shè)備網(wǎng)絡(luò)SDK進(jìn)行Java二次開(kāi)發(fā)攝像頭車(chē)牌識(shí)別詳解
這篇文章主要介紹了如何通過(guò)??低曉O(shè)備網(wǎng)絡(luò)SDK進(jìn)行Java二次開(kāi)發(fā)攝像頭車(chē)牌識(shí)別的相關(guān)資料,描述了如何使用海康威視設(shè)備網(wǎng)絡(luò)SDK進(jìn)行車(chē)牌識(shí)別和圖片抓拍的開(kāi)發(fā)流程,包括遇到的問(wèn)題及其解決辦法,需要的朋友可以參考下2025-02-02
Java Spring分別實(shí)現(xiàn)定時(shí)任務(wù)方法
這篇文章主要為大家詳細(xì)介紹了Java與Spring設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法,定時(shí)任務(wù)的應(yīng)用場(chǎng)景十分廣泛,如定時(shí)清理文件、定時(shí)生成報(bào)表、定時(shí)數(shù)據(jù)同步備份等2022-07-07
java?Web實(shí)現(xiàn)用戶(hù)登錄功能圖文教程
這篇文章主要給大家介紹了關(guān)于java?Web實(shí)現(xiàn)用戶(hù)登錄功能的相關(guān)資料,在開(kāi)發(fā)Web應(yīng)用程序中,用戶(hù)登錄是一個(gè)常見(jiàn)的功能,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

