之前在做項目的時候用到了Spring Boot 2.0,這里簡單介紹一下Spring Boot 2.0 連接池的使用和遇到的一些坑垫言。
Spring Boot 默認(rèn)使用的連接池是 HikariCP 泳桦,當(dāng)在在依賴中引入了
spring-boot-starter-jdbc
或者 spring-boot-starter-data-jpa
十偶,且application.properties中沒有配置spring.datasource.type 為其他的DataSource時。Spring Boot 會默認(rèn)使用HiKariCP罩引,如果需要使用其他的連接池茸苇,例如tomcat 連接池排苍,則需要引入 tomcat-jdbc 依賴:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.5.23</version>
</dependency>
并且在application.properties中配置spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
作者使用的yml:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: xxx
password: xxxx
url: jdbc:mysql://localhost:3306/friends?useUnicode=true&character_set_server=utf8mb4&characterEncoding=utf8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
type: org.apache.tomcat.jdbc.pool.DataSource
之前在做項目的時候,使用Spring Boot數(shù)據(jù)庫連接池遇到過一些問題学密,在這里總結(jié)一下淘衙。
因為做項目用的是MySQL,MySQL有個默認(rèn)機制是八個小時空閑連接會自動回收腻暮,這個回收是在MySQL的Server端彤守,而Spring Boot 的連接池不知道這個連接已經(jīng)不可用了,繼續(xù)用這個連接查詢的話就會報錯西壮,所以需要在配置數(shù)據(jù)庫連接池的時候增加一些檢測配置遗增,把一些不可用的連接釋放掉叫惊。
用HiKariCP需要以下配置(當(dāng)使用的jdbc不是jdbc4的時候):
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: xxx
password: xxxx
url: jdbc:mysql://localhost:3306/friends?useUnicode=true&character_set_server=utf8mb4&characterEncoding=utf8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
hikari:
maximum-pool-size: 10 連接池最大連接數(shù)
minimum-idle: 0 允許的最小空閑屬
idle-timeout: 180000 #空閑超時是 180000 毫秒款青,當(dāng)數(shù)據(jù)庫連接的空閑時間大于180000毫秒時,這些空閑超時的連接會被關(guān)閉霍狰,直到超時的空閑連接數(shù)達到 minimum-idle的值
connection-test-query: select 1 # 測試連接是否可用的query 語句 在oracle是 select 1 from dual
如果是tomcat 可能還要加上一個檢測空閑的間隔時間抡草。
一下介紹一些常用的HiKariCP的配置參數(shù),讀者也可以自己瀏覽HiKariCP的GitHub:
dataSourceClassName | 這是JDBC驅(qū)動程序提供的DataSource類的名稱蔗坯。 請參閱特定JDBC驅(qū)動程序的文檔以獲取此類名.注意不支持XA數(shù)據(jù)源康震。 XA需要像bitronix這樣的真正的事務(wù)管理器。 請注意宾濒,如果您使用jdbcUrl進行“old-school”基于DriverManager的JDBC驅(qū)動程序配置腿短,則不需要此屬性 |
jdbcUrl | 數(shù)據(jù)庫連接url |
username | 用戶名 |
password | 密碼 |
autoCommit | 自動提交,默認(rèn)是true |
connectionTimeout | 連接超時時間設(shè)置绘梦,默認(rèn)是30s |
idleTimeout | 最大空閑時間橘忱,超過最大空閑時間的連接在達到最小空閑連接數(shù) minimumIdle 就不會被回收。默認(rèn)十分鐘 |
minimumIdle | 允許的最小空閑數(shù)卸奉。當(dāng)minimumIdl大于等于 maximumPoolSize 時钝诚,空閑超時的連接不會被回收。默認(rèn)是等于 maximumPoolSize |
maximumPoolSize | 最大連接數(shù)榄棵,默認(rèn)10 |
connectionTestQuery | 測試連接是否可用的query語句 |
maxLifetime | 最長生命周期凝颇,使用中的連接永遠不會退役潘拱,只有當(dāng)它關(guān)閉時才會被刪除。默認(rèn)30分鐘 |
如有需要后續(xù)再補充一些tomcat 連接池的拧略。