数据库连接池为什么首选Druid( 二 )


用来检测连接是否有效的sql,要求是一个查询语句,常用select ‘x’ 。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用 。validationQueryTimeout
单位:秒,检测连接是否有效的超时时间 。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 。testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 。testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性 。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 。keepAlivefalse (1.0.28)连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 。timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接 。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明numTestsPerEvictionRun30分钟(1.0.14)不再使用,一个DruidDataSource只支持一个EvictionRunminEvictableIdleTimeMillis
连接保持空闲而不被驱逐的最小时间connectionInitSqls
物理连接初始化的时候执行的sqlexceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接filters
属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wallproxyFilters
类型是List,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系
Druid提供以下几种Filter信息:
别名Filter类名defaultcom.alibaba.druid.filter.stat.StatFilterstatcom.alibaba.druid.filter.stat.StatFiltermergeStatcom.alibaba.druid.filter.stat.MergeStatFilterencodingcom.alibaba.druid.filter.encoding.EncodingConvertFilterlog4jcom.alibaba.druid.filter.logging.Log4jFilterlog4j2com.alibaba.druid.filter.logging.Log4j2Filterslf4jcom.alibaba.druid.filter.logging.Slf4jLogFiltercommonloggingcom.alibaba.druid.filter.logging.CommonsLogFilterwallcom.alibaba.druid.wall.WallFilter
4、Druid 监控支持多种形式,本文列举的是JAVA类创建Bean实例方式 。
@Beanpublic ServletRegistrationBean druidServlet() {    logger.info("init Druid Servlet Configuration ");    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();    servletRegistrationBean.setServlet(new StatViewServlet());    servletRegistrationBean.addUrlMappings("/druid/*");    Map<String, String> initParameters = new HashMap<String, String>();    initParameters.put("loginUsername", "admin");// 用户名    initParameters.put("loginPassword", "admin");// 密码    initParameters.put("resetEnable", "false");// 禁用html页面上的“Reset All”功能    initParameters.put("allow", ""); // IP白名单 (没有配置或者为空,则允许所有访问)    //initParameters.put("deny", "192.168.20.38");// IP黑名单 (存在共同时,deny优先于allow)    servletRegistrationBean.setInitParameters(initParameters);    return servletRegistrationBean;}@Beanpublic FilterRegistrationBean filterRegistrationBean() {    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();    filterRegistrationBean.setFilter(new WebStatFilter());    filterRegistrationBean.addUrlPatterns("/*");    filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");    return filterRegistrationBean;}也可以采用另一种方式,在application.properties中添加Druid的监控配置
# druid连接池监控spring.datasource.druid.stat-view-servlet.login-username=adminspring.datasource.druid.stat-view-servlet.login-password=admin# 配置 StatFilterspring.datasource.druid.filter.stat.log-slow-sql=truespring.datasource.druid.filter.stat.slow-sql-millis=2000# 排除一些静态资源,以提高效率spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*配置完成后,并完成相关的数据库操作配置,启动Spring Boot应用程序 。


推荐阅读