Spring Boot 連接池


配置方法

基於當前的1.5.2.RELEASE的Spring Boot。 依照官方文檔,如果增加了如下依賴的配置,或者類路徑中存在spring-boot-starter-jdbc的jar,那么已默認啟用了數據庫鏈接池。

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>


Tomcat7之前,Tomcat本質應用了DBCP連接池技術來實現的JDBC數據源,但在Tomcat7之后,Tomcat提供了新的JDBC連接池方案,作為DBCP的替換或備選方案,解決了許多之前使用DBCP的不利之處,並提高了性能。詳細請參考:http://wiki.jikexueyuan.com/project/tomcat/tomcat-jdbc-pool.html

Spring Boot為我們准備了最佳的數據庫連接池方案,只需要在屬性文件(例如application.properties)中配置需要的連接池參數即可。 
我們使用Tomcat數據源連接池,需要依賴tomcat-jdbc,只要應用中添加了spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa依賴,則無需擔心這點,因為將會自動添加 tomcat-jdbc 依賴。 

 

Spring Boot選擇數據庫鏈接池實現的判斷邏輯:

  1. 檢查Tomcat的數據庫鏈接池實現是否可用,如可用,則啟用。使用spring.datasource.tomcat.*可以控制鏈接池的行為。
  2. 檢查HikariCP是否可用,如可用,則啟用。使用spring.datasource.hikari.*可以控制鏈接池的行為。
  3. 檢查Commons DBCP是否可用,如可用,則啟用;但Spring Boot不建議在生產環境使用該鏈接池的實現。
  4. 檢查Commons DBCP2是否可用,如可用,則啟用。使用spring.datasource.dbcp2.*可以控制鏈接池的行為。

 

默認連接池規則

在引入spring-boot-starter-jdbc后,內部包含了tomcat-jdbc包,里面有tomcat連接池.然后通過自動配置DataSourceAutoConfigurer創建DataSource對象。

SpringBoot創建默認DataSource時,規則如下:

  • 優先尋找創建Tomcat連接池
  • 如果沒有Tomcat連接池,會查找創建HikariCP
  • 如果沒有HikariCP連接池,會查找創建dbcp
  • 如果沒有dbcp連接池,會查找創建dbcp2
  • 可以使用spring.datasource.type屬性指定連接池類型

    spring.datasource.type=org.apache.commons.dbcp.BasicDataSource

 

使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM