Spring Boot配置資料庫連結池
阿新 • • 發佈:2019-01-08
配置方法
基於當前的1.5.2.RELEASE的Spring Boot。 依照官方文件,如果增加了如下依賴的配置,或者類路徑中存在spring-boot-starter-jdbc
的jar,那麼已預設啟用了資料庫連結池。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Spring Boot選擇資料庫連結池實現的判斷邏輯:
- 檢查Tomcat的資料庫連結池實現是否可用,如可用,則啟用。使用
spring.datasource.tomcat.*
- 檢查HikariCP是否可用,如可用,則啟用。使用
spring.datasource.hikari.*
可以控制連結池的行為。 - 檢查Commons DBCP是否可用,如可用,則啟用;但Spring Boot不建議在生產環境使用該連結池的實現。
- 檢查Commons DBCP2是否可用,如可用,則啟用。使用
spring.datasource.dbcp2.*
可以控制連結池的行為。
tomcat-jdbc
時,可在application.yml
增加配置項spring.datasource.tomcat.*
來控制連結池的行為。比如如下配置。
上述spring: datasource: url: jdbc:mysql://localhost:3306/jackieathome?useSSL=false username: root password: mypassword # 6.x版本的MySQL JDBC驅動類為com.mysql.cj.jdbc.Driver # 5.X版本的MySQL JDBC驅動類為com.mysql.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver tomcat: max-wait: 10000 max-active: 30 test-on-borrow: true # 傳遞MySQL JDBC特有的引數 db-properties: logger: net.jackieathome.db.customized.MySQLLogger gatherPerfMetrics: 'true' profileSQL: 'true' reportMetricsIntervalMillis: '60000' logSlowQueries: 'true' explainSlowQueries: 'true' logging: level: # 關閉其它軟體的日誌,減少干擾 org: ERROR net: ERROR com: ERROR # 開啟MySQL JDBC驅動的日誌 MySQL: DEBUG
spring.datasource.tomcat.*
代表的配置項,可參考tomcat-jdbc
的官方文件Apache Tomcat 8.5 - The Tomcat JDBC Connection Pool或者Apache Tomcat 8.0 - The Tomcat JDBC Connection Pool。
依據tomcat-jdbc
的文件,如需要向資料庫的JDBC驅動傳入控制引數,可以使用db-properties
欄位。需要注意的是,當使用MySQL驅動時,控制引數的值需要強制轉換為字串,否則建立資料庫連結時會報錯。配置方法如上述樣例中的 reportMetricsIntervalMillis: '60000'
logSlowQueries: 'true'
。
依照MySQL JDBC驅動文件,可以配置一個日誌記錄器,用於記錄其工作時的輸出,如下是實現樣例。
package net.jackieathome.db.customized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MySQLLogger implements com.mysql.cj.api.log.Log {
private static Logger LOG;
public MySQLLogger(String name) {
LOG = LoggerFactory.getLogger(name);
}
@Override
public boolean isDebugEnabled() {
return LOG.isDebugEnabled();
}
@Override
public boolean isErrorEnabled() {
return LOG.isErrorEnabled();
}
@Override
public boolean isFatalEnabled() {
return LOG.isErrorEnabled();
}
@Override
public boolean isInfoEnabled() {
return LOG.isInfoEnabled();
}
@Override
public boolean isTraceEnabled() {
return LOG.isTraceEnabled();
}
@Override
public boolean isWarnEnabled() {
return LOG.isWarnEnabled();
}
@Override
public void logDebug(Object msg) {
LOG.debug("{}", msg);
}
@Override
public void logDebug(Object msg, Throwable thrown) {
LOG.debug("{}", msg, thrown);
}
@Override
public void logError(Object msg) {
LOG.error("{}", msg);
}
@Override
public void logError(Object msg, Throwable thrown) {
LOG.error("{}", msg, thrown);
}
@Override
public void logFatal(Object msg) {
LOG.error("{}", msg);
}
@Override
public void logFatal(Object msg, Throwable thrown) {
LOG.error("{}", msg, thrown);
}
@Override
public void logInfo(Object msg) {
LOG.info("{}", msg);
}
@Override
public void logInfo(Object msg, Throwable thrown) {
LOG.info("{}", msg, thrown);
}
@Override
public void logTrace(Object msg) {
LOG.trace("{}", msg);
}
@Override
public void logTrace(Object msg, Throwable thrown) {
LOG.trace("{}", msg, thrown);
}
@Override
public void logWarn(Object msg) {
LOG.warn("{}", msg);
}
@Override
public void logWarn(Object msg, Throwable thrown) {
LOG.warn("{}", msg, thrown);
}
}
同時修改application.yml
,增加相應的日誌配置,如下。
logging:
level:
# 開啟MySQL JDBC驅動的日誌
MySQL: DEBUG
如下是MySQL JDBC驅動輸出的樣例日誌。
2017-04-16 00:51:32.626 QUERY created: Sun Apr 16 00:51:32 CST 2017 duration: 0 connection: 93 statement: 1 resultset: 1 message: /* mysql-connector-java-6.0.6 ( Revision: 3dab84f4d9bede3cdd14d57b99e9e98a02a5b97d ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout
2017-04-16 00:51:32.629 FETCH created: Sun Apr 16 00:51:32 CST 2017 duration: 36 connection: 93 statement: 1 resultset: 1
2017-04-16 00:51:32.639 QUERY created: Sun Apr 16 00:51:32 CST 2017 duration: 1 connection: 93 statement: 999 resultset: 0 message: SET NAMES latin1
2017-04-16 00:51:32.640 FETCH created: Sun Apr 16 00:51:32 CST 2017 duration: 0 connection: 93 statement: 999 resultset: 0
2017-04-16 00:51:32.642 QUERY created: Sun Apr 16 00:51:32 CST 2017 duration: 2 connection: 93 statement: 999 resultset: 0 message: SET character_set_results = NULL
2017-04-16 00:51:32.643 FETCH created: Sun Apr 16 00:51:32 CST 2017 duration: 0 connection: 93 statement: 999 resultset: 0
2017-04-16 00:51:32.645 QUERY created: Sun Apr 16 00:51:32 CST 2017 duration: 0 connection: 93 statement: 999 resultset: 0 message: SET autocommit=1
2017-04-16 00:51:32.646 FETCH created: Sun Apr 16 00:51:32 CST 2017 duration: 0 connection: 93 statement: 999 resultset: 0
2017-04-16 00:51:32.667 QUERY created: Sun Apr 16 00:51:32 CST 2017 duration: 1 connection: 94 statement: 2 resultset: 2 message: /* mysql-connector-java-6.0.6 ( Revision: 3dab84f4d9bede3cdd14d57b99e9e98a02a5b97d ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout
參考資料
Spring的連結池配置
Spring Boot的連結池的配置
Tomcat的連結池的配置
MySQL JDBC
檢視原文:http://www.jackieathome.net/archives/487.html