javascript
Spring Boot 中使用 Hikari,给我整不会了
前言
最近自己使用 Spring boot 搭建了一個非常簡單的項目,可是不知道為啥控制臺總是出現(xiàn)
Thread starvation or clock leap detected (housekeeper delta=3h24s779ms457μs999ns).氣的我直接找到源碼,GitHub 一頓查詢。最終解決了問題,開心。
我是使用 Spring Boot 2.5.4 我們都知道 Spring boot 默認(rèn)就依賴了 Hikari ,而我的 JDK 版本是 11 ,這里就有問題了 Spring boot 的默認(rèn)版本和官方推薦 JDK11 使用的版本不一致,對應(yīng)于 JDK 11, 建議使用 5.0.0 的 Hikari 。
Hikari 介紹
不知道怎么搞的,我一直隱約感覺 Hikari 是阿里的框架,直到我打開 GitHub 啊,這不對啊,這好像是個日本的程序員寫的呢?剛好說說這個名字,Hikari 怎么讀的呢?可以讀成 ”黑卡瑞“ ,大致看了一下 GitHub 的介紹,大呼一聲,真秀!一個中國人在看日本人用英語寫的文檔,總感覺哪里怪怪的,但又說不上來。
說回到 Hikari ,它是一個連接池,官方給了這么幾個形容詞,fast,simple,reliable,zero-overhead,very light. 嗯聽起來很好對吧,據(jù)說是史上最快的連接池。
我這里引用一句官方的話
The HikariCP design aesthetic is Minimalism. In keeping with the simple is better or less is more design philosophy, some configuration axis are intentionally left out.
Hikari 的設(shè)計美學(xué)是極簡主義,少即是多的哲學(xué),為此它還刻意減少一些參數(shù),這點真的是直擊我心。less is more and keep it simple and stupid.
在 GitHub 上作者甚至還介紹了他的優(yōu)化點,都是一些比較小的點,但正是這些小的點匯集起來了,才使得 Hikari 的性能這么給力。優(yōu)化的點是什么我就不具體說了,像什么緩存,靜態(tài)方法,重寫 ArrayList ...
Hikari 的使用
作為開發(fā)者的我們,使用 Hikari 還是非常簡單的,以我使用的 MySQL 為例,JDK 11 配置了 5.0.0 版本的 Hikari.
1 引入依賴
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>5.0.0</version></dependency>2 初始化
如果不是看官網(wǎng),我不曾知道原來有這么多的初始化方式,我要一一的列舉出來,擴展大家的思路。
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons"); config.setUsername("bart"); config.setPassword("51mp50n"); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); ? HikariDataSource ds = new HikariDataSource(config);或者直接這樣
HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons"); ds.setUsername("bart"); ds.setPassword("51mp50n"); ...或者基于配置文件的初始化
HikariConfig config = new HikariConfig("/some/path/hikari.properties"); HikariDataSource ds = new HikariDataSource(config); ? ? // properties file dataSourceClassName=org.postgresql.ds.PGSimpleDataSource dataSource.user=test dataSource.password=test dataSource.databaseName=mydb dataSource.portNumber=5432 dataSource.serverName=localhost或者直接使用 Properties 類
Properties props = new Properties(); props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource"); props.setProperty("dataSource.user", "test"); props.setProperty("dataSource.password", "test"); props.setProperty("dataSource.databaseName", "mydb"); props.put("dataSource.logWriter", new PrintWriter(System.out)); ? HikariConfig config = new HikariConfig(props); HikariDataSource ds = new HikariDataSource(config);甚至還可以配置環(huán)境變量
There is also a System property available, hikaricp.configurationFile,看到以上這些初始化的方法,直呼過癮。
項目配置中的常用參數(shù)講解
以為搭建的 Spring boot 項目為例,看看我的配置吧。
根據(jù) less is more 的設(shè)計哲學(xué),以 Hikari 開頭的配置都是可選的配置,都有默認(rèn)的值,不配也行哈。
autoCommit: 默認(rèn)是 true,自動提交從池中返回的連接。
connectionTimeout:等待來自池的連接的最大毫秒數(shù),默認(rèn)為 30000 ms = 30 s,允許最小時間是 250 毫秒,如果小于 250 毫秒,則被重置回 30 秒。
idleTimeout: 連接允許在池中閑置的最長時間,默認(rèn)為 600000,即 10 分鐘。如果 idleTimeout + 1 秒 > maxLifetime 且 maxLifetime > 0,則會被重置為 0(代表永遠(yuǎn)不會退出);如果 idleTimeout != 0 且小于 10 秒,則會被重置為 10 秒。只有當(dāng) minimumIdle 小于 maximumPoolSize 時,這個參數(shù)才生效,當(dāng)空閑連接數(shù)超過 minimumIdle,而且空閑時間超過 idleTimeout,則會被移除。
keepaliveTime:連接存活時間,這個值必須小于 maxLifetime 值。Keepalive "只會發(fā)生在空閑的連接上。當(dāng)對一個給定的連接進(jìn)行 "keepalive "的時間到了,該連接將從池中移除。允許的最小值是 30000 ms(30秒),但最理想的值是在分鐘范圍內(nèi)。默認(rèn)值:0
maxLifetime:池中連接最長生命周期。默認(rèn)為 1800000,如果不等于 0 且小于 30 秒則會被重置回 30 分鐘。強烈建議設(shè)置這個參數(shù)。
minimumIdle:控制連接池空閑連接的最小數(shù)量,當(dāng)連接池空閑連接少于 minimumIdle,而且總共連接數(shù)不大于 maximumPoolSize 時,HikariCP 會盡力補充新的連接。為了性能考慮,不建議設(shè)置此值,而是讓 HikariCP 把連接池當(dāng)做固定大小的處理,默認(rèn) minimumIdle 與 maximumPoolSize 一樣。當(dāng) minIdle < 0 或者 minIdle > maxPoolSize,則被重置為 maxPoolSize,該值默認(rèn)為 10。
maximumPoolSize:池中最大連接數(shù),包括閑置和使用中的連接。默認(rèn)為 10。如果 maxPoolSize 小于1,則會被重置。當(dāng) minIdle <=0 被重置為DEFAULT_POOL_SIZE 則為 10;如果 minIdle > 0 則重置為 minIdle 的值。
poolName:連接池的用戶定義名稱,主要出現(xiàn)在日志記錄和 JMX 管理控制臺中以識別池和池配置。默認(rèn)為 HikariPool-1。
readOnly:從池中獲取的連接是否默認(rèn)處于只讀模式。默認(rèn)為 false。這個屬性工作與否取決于數(shù)據(jù)庫的實現(xiàn)。
connectionTestQuery:如果你的驅(qū)動程序支持 JDBC4,我們強烈建議不要設(shè)置這個屬性。這是針對不支持 JDBC4 Connection.isValid() API的 "傳統(tǒng) "驅(qū)動程序。這是一個查詢,在一個連接從池子里給你之前會被執(zhí)行,以驗證與數(shù)據(jù)庫的連接是否仍然有效。同樣,嘗試在沒有這個屬性的情況下運行數(shù)據(jù)庫池,如果你的驅(qū)動不符合JDBC4標(biāo)準(zhǔn),HikariCP 會記錄一個錯誤,讓你知道。默認(rèn)值:無。
最后
說一下我的那個警告是怎么解決的吧,更新了 jar 包,更改了配置,idle-timeout 要小于 max-lifetime 的呀,開始不知道在哪里 copy 的,他們的值不對,就很氣…… 好吧也怪自己沒有好好研究,就直到 copy paste。 官方才是最香的,看看官方文檔,這波不虧。
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 中使用 Hikari,给我整不会了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功能、资源权限管理的设计
- 下一篇: TCP 拥塞窗口原理