Druid 阿里开源的数据库连接池
选择的理由:
- Druid 经历了阿里双十一的场景,足以可见其性能。
- Druid 有完整的监控,可以实时监控数据库状态及sql的执行时间。
- 提供有丰富的监控器,自定义监控器也很方便。
springboot 默认的连接池是HikariCP,使用Druid :
- 引入jar 包。
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
- 在application.properties 里配置相关属性:
#连接池配置 #<!-- 配置初始化大小、最小、最大 --> spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=10 spring.datasource.druid.max-active=20 #<!-- 配置获取连接等待超时的时间 60秒--> spring.datasource.druid.max-wait=60000 #<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> spring.datasource.druid.time-between-eviction-runs-millis=60000 #<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> spring.datasource.druid.min-evictable-idle-time-millis=60000 #spring.datasource.druid.max-evictable-idle-time-millis=90000 #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 spring.datasource.druid.max-open-prepared-statements= -1 #检测连接是否有效的语句,及超时时间 spring.datasource.druid.validation-query=SELECT 1 spring.datasource.druid.validation-query-timeout=30 #申请连接是否检测,归还连接是否检测 ,空闲是否检测 spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.test-while-idle=true #druid 日志输出 spring.datasource.druid.filter.slf4j.enabled=true spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false spring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=false spring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=false spring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false #插件配置 监控统计用的filter:stat #日志用的filter:log4j #防御sql注入的filter:wall spring.datasource.druid.filters=stat,wall # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter #sql 合并,慢sql展示监控 超过20秒为慢sql spring.datasource.druid.filter.stat.merge-sql=true spring.datasource.druid.filter.stat.log-slow-sql=true spring.datasource.druid.filter.stat.slow-sql-millis=20000 spring.datasource.druid.web-stat-filter.enabled= true spring.datasource.druid.web-stat-filter.url-pattern=/* spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/* spring.datasource.druid.web-stat-filter.session-stat-enable=true spring.datasource.druid.web-stat-filter.session-stat-max-count=10 #spring.datasource.druid.web-stat-filter.principal-session-name=admin #spring.datasource.druid.web-stat-filter.principal-cookie-name=admin #spring.datasource.druid.web-stat-filter.profile-enable=true # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置 spring.datasource.druid.stat-view-servlet.enabled= true spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.reset-enable=false spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=admin #Ip白名单 黑名单 黑名单优先,黑名单中存在就不可访问。 #spring.datasource.druid.stat-view-servlet.allow= #spring.datasource.druid.stat-view-servlet.deny= # AOP 监控拦截切入点 spring.datasource.druid.aop-patterns=com.example.demo.mapper.*,com.example.demo.service.*,com.example.demo.web.*
- 启动项目进行访问。可以看到执行 的sql的详细信息。
这里输出的数据库日志采用logback,详细配置如下:
<!-- druid 数据库连接池日志输出-->
<appender name="druidSqlRollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}] %-5level %L %M - %msg%xEx%n</pattern>
</encoder>
<file>${ROOT_LOG_DIR}/druid-sql.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ROOT_LOGBAK_DIR}/%d{yyyy-MM-dd}/api-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- 单个日志文件最多 100MB, 100天的日志周期,最大不能超过1000GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>100</maxHistory>
<maxHistory>100GB</maxHistory>
</rollingPolicy>
</appender>
<!--记录druid-sql的记录-->
<logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="druidSqlRollingFile"/>
</logger>
- 可以看到日志输出: