Spring Boot数据库链接池配置方法
配置方法
基于当前的1.5.2.RELEASE的SpringBoot。
依照官方文档,如果增加了如下依赖的配置,或者类路径中存在spring-boot-starter-jdbc的jar,那么已默认启用了数据库链接池。
org.springframework.boot spring-boot-starter-jdbc
SpringBoot选择数据库链接池实现的判断逻辑:
1.检查Tomcat的数据库链接池实现是否可用,如可用,则启用。使用spring.datasource.tomcat.*可以控制链接池的行为。
2.检查HikariCP是否可用,如可用,则启用。使用spring.datasource.hikari.*可以控制链接池的行为。
3.检查CommonsDBCP是否可用,如可用,则启用;但SpringBoot不建议在生产环境使用该链接池的实现。
4.检查CommonsDBCP2是否可用,如可用,则启用。使用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版本的MySQLJDBC驱动类为com.mysql.cj.jdbc.Driver #5.X版本的MySQLJDBC驱动类为com.mysql.jdbc.Driver driver-class-name:com.mysql.cj.jdbc.Driver tomcat: max-wait:10000 max-active:30 test-on-borrow:true #传递MySQLJDBC特有的参数 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 #开启MySQLJDBC驱动的日志 MySQL:DEBUG
上述spring.datasource.tomcat.*代表的配置项,可参考tomcat-jdbc的官方文档ApacheTomcat8.5-TheTomcatJDBCConnectionPool或者ApacheTomcat8.0-TheTomcatJDBCConnectionPool。
依据tomcat-jdbc的文档,如需要向数据库的JDBC驱动传入控制参数,可以使用db-properties字段。需要注意的是,当使用MySQL驱动时,控制参数的值需要强制转换为字符串,否则创建数据库链接时会报错。配置方法如上述样例中的reportMetricsIntervalMillis:'60000'和logSlowQueries:'true'。
依照MySQLJDBC驱动文档,可以配置一个日志记录器,用于记录其工作时的输出,如下是实现样例。
packagenet.jackieathome.db.customized; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; publicclassMySQLLoggerimplementscom.mysql.cj.api.log.Log{ privatestaticLoggerLOG; publicMySQLLogger(Stringname){ LOG=LoggerFactory.getLogger(name); } @Override publicbooleanisDebugEnabled(){ returnLOG.isDebugEnabled(); } @Override publicbooleanisErrorEnabled(){ returnLOG.isErrorEnabled(); } @Override publicbooleanisFatalEnabled(){ returnLOG.isErrorEnabled(); } @Override publicbooleanisInfoEnabled(){ returnLOG.isInfoEnabled(); } @Override publicbooleanisTraceEnabled(){ returnLOG.isTraceEnabled(); } @Override publicbooleanisWarnEnabled(){ returnLOG.isWarnEnabled(); } @Override publicvoidlogDebug(Objectmsg){ LOG.debug("{}",msg); } @Override publicvoidlogDebug(Objectmsg,Throwablethrown){ LOG.debug("{}",msg,thrown); } @Override publicvoidlogError(Objectmsg){ LOG.error("{}",msg); } @Override publicvoidlogError(Objectmsg,Throwablethrown){ LOG.error("{}",msg,thrown); } @Override publicvoidlogFatal(Objectmsg){ LOG.error("{}",msg); } @Override publicvoidlogFatal(Objectmsg,Throwablethrown){ LOG.error("{}",msg,thrown); } @Override publicvoidlogInfo(Objectmsg){ LOG.info("{}",msg); } @Override publicvoidlogInfo(Objectmsg,Throwablethrown){ LOG.info("{}",msg,thrown); } @Override publicvoidlogTrace(Objectmsg){ LOG.trace("{}",msg); } @Override publicvoidlogTrace(Objectmsg,Throwablethrown){ LOG.trace("{}",msg,thrown); } @Override publicvoidlogWarn(Objectmsg){ LOG.warn("{}",msg); } @Override publicvoidlogWarn(Objectmsg,Throwablethrown){ LOG.warn("{}",msg,thrown); } }
同时修改application.yml,增加相应的日志配置,如下。
logging: level: #开启MySQLJDBC驱动的日志 MySQL:DEBUG
如下是MySQLJDBC驱动输出的样例日志。
2017-04-1600:51:32.626QUERYcreated:SunApr1600:51:32CST2017duration:0connection:93statement:1resultset:1message:/*mysql-connector-java-6.0.6(Revision:3dab84f4d9bede3cdd14d57b99e9e98a02a5b97d)*/SELECT @@session.auto_increment_incrementASauto_increment_increment,@@character_set_clientAScharacter_set_client,@@character_set_connectionAScharacter_set_connection,@@character_set_resultsAScharacter_set_results,@@character_set_serverAScharacter_set_server,@@init_connectASinit_connect,@@interactive_timeoutASinteractive_timeout,@@licenseASlicense,@@lower_case_table_namesASlower_case_table_names,@@max_allowed_packetASmax_allowed_packet,@@net_buffer_lengthASnet_buffer_length,@@net_write_timeoutASnet_write_timeout,@@query_cache_sizeASquery_cache_size,@@query_cache_typeASquery_cache_type,@@sql_modeASsql_mode,@@system_time_zoneASsystem_time_zone,@@time_zoneAStime_zone,@@tx_isolationAStx_isolation,@@wait_timeoutASwait_timeout
2017-04-1600:51:32.629FETCHcreated:SunApr1600:51:32CST2017duration:36connection:93statement:1resultset:1
2017-04-1600:51:32.639QUERYcreated:SunApr1600:51:32CST2017duration:1connection:93statement:999resultset:0message:SETNAMESlatin1
2017-04-1600:51:32.640FETCHcreated:SunApr1600:51:32CST2017duration:0connection:93statement:999resultset:0
2017-04-1600:51:32.642QUERYcreated:SunApr1600:51:32CST2017duration:2connection:93statement:999resultset:0message:SETcharacter_set_results=NULL
2017-04-1600:51:32.643FETCHcreated:SunApr1600:51:32CST2017duration:0connection:93statement:999resultset:0
2017-04-1600:51:32.645QUERYcreated:SunApr1600:51:32CST2017duration:0connection:93statement:999resultset:0message:SETautocommit=1
2017-04-1600:51:32.646FETCHcreated:SunApr1600:51:32CST2017duration:0connection:93statement:999resultset:0
2017-04-1600:51:32.667QUERYcreated:SunApr1600:51:32CST2017duration:1connection:94statement:2resultset:2message:/*mysql-connector-java-6.0.6(Revision:3dab84f4d9bede3cdd14d57b99e9e98a02a5b97d)*/SELECT @@session.auto_increment_incrementASauto_increment_increment,@@character_set_clientAScharacter_set_client,@@character_set_connectionAScharacter_set_connection,@@character_set_resultsAScharacter_set_results,@@character_set_serverAScharacter_set_server,@@init_connectASinit_connect,@@interactive_timeoutASinteractive_timeout,@@licenseASlicense,@@lower_case_table_namesASlower_case_table_names,@@max_allowed_packetASmax_allowed_packet,@@net_buffer_lengthASnet_buffer_length,@@net_write_timeoutASnet_write_timeout,@@query_cache_sizeASquery_cache_size,@@query_cache_typeASquery_cache_type,@@sql_modeASsql_mode,@@system_time_zoneASsystem_time_zone,@@time_zoneAStime_zone,@@tx_isolationAStx_isolation,@@wait_timeoutASwait_timeout
以上所述是小编给大家介绍的SpringBoot数据库链接池配置方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!