引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连接池,在连接池之外,还提供了非常优秀的监控功能,这里讲解如何与Spring Boot实现集成。
1. 环境描述
Spring Boot 1.4.0.RELEASE, JDK 1.8
2. Druid介绍
Druid是一个JDBC组件,它包括三部分:
DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。DruidDataSource 高效可管理的数据库连接池。SQLParser
Druid可以做什么?
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。
项目地址: /alibaba/druid
3. Spring Boot与Druid的集成
MySQL Driver驱动包:
[html]view plaincopy <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
Spring Boot的JPA依赖包:
[html]view plaincopy <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
阿里系的Druid依赖包:
[html]view plaincopy <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.25</version></dependency>
Spring Boot中的application.properties配置信息:
[html]view plaincopy #驱动配置信息spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://127.0.0.1:3306/mealsystem?useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.driverClassName=com.mysql.jdbc.Driver#连接池的配置信息spring.datasource.initialSize=5spring.datasource.minIdle=5spring.datasource.maxActive=20spring.datasource.maxWait=60000spring.datasource.timeBetweenEvictionRunsMillis=60000spring.datasource.minEvictableIdleTimeMillis=300000spring.datasource.validationQuery=SELECT1FROMDUALspring.datasource.testWhileIdle=truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=falsespring.datasource.poolPreparedStatements=truespring.datasource.maxPoolPreparedStatementPerConnectionSize=20spring.datasource.filters=stat,wall,log4jspring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
在Spring Boot1.4.0中驱动配置信息没有问题,但是连接池的配置信息不再支持这里的配置项,即无法通过配置项直接支持相应的连接池;这里列出的这些配置项可以通过定制化DataSource来实现。
目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池。
由于Druid暂时不在Spring Bootz中的直接支持,故需要进行配置信息的定制:
[html]view plaincopy @ConfigurationpublicclassDruidDBConfig{privateLoggerlogger=LoggerFactory.getLogger(DruidDBConfig.class);@Value("${spring.datasource.url}")privateStringdbUrl;@Value("${spring.datasource.username}")privateStringusername;@Value("${spring.datasource.password}")privateStringpassword;@Value("${spring.datasource.driverClassName}")privateStringdriverClassName;@Value("${spring.datasource.initialSize}")privateintinitialSize;@Value("${spring.datasource.minIdle}")privateintminIdle;@Value("${spring.datasource.maxActive}")privateintmaxActive;@Value("${spring.datasource.maxWait}")privateintmaxWait;@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")privateinttimeBetweenEvictionRunsMillis;@Value("${spring.datasource.minEvictableIdleTimeMillis}")privateintminEvictableIdleTimeMillis;@Value("${spring.datasource.validationQuery}")privateStringvalidationQuery;@Value("${spring.datasource.testWhileIdle}")privatebooleantestWhileIdle;@Value("${spring.datasource.testOnBorrow}")privatebooleantestOnBorrow;@Value("${spring.datasource.testOnReturn}")privatebooleantestOnReturn;@Value("${spring.datasource.poolPreparedStatements}")privatebooleanpoolPreparedStatements;@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")privateintmaxPoolPreparedStatementPerConnectionSize;@Value("${spring.datasource.filters}")privateStringfilters;@Value("{spring.datasource.connectionProperties}")privateStringconnectionProperties;@Bean//声明其为Bean实例@Primary//在同样的DataSource中,首先使用被标注的DataSourcepublicDataSourcedataSource(){DruidDataSourcedatasource=newDruidDataSource();datasource.setUrl(this.dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);//configurationdatasource.setInitialSize(initialSize);datasource.setMinIdle(minIdle);datasource.setMaxActive(maxActive);datasource.setMaxWait(maxWait);datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);datasource.setValidationQuery(validationQuery);datasource.setTestWhileIdle(testWhileIdle);datasource.setTestOnBorrow(testOnBorrow);datasource.setTestOnReturn(testOnReturn);datasource.setPoolPreparedStatements(poolPreparedStatements);datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);try{datasource.setFilters(filters);}catch(SQLExceptione){logger.error("druidconfigurationinitializationfilter",e);}datasource.setConnectionProperties(connectionProperties);returndatasource;}}
DruidDBConfig类被@Configuration标注,用作配置信息; DataSource对象被@Bean声明,为Spring容器所管理, @Primary表示这里定义的DataSource将覆盖其他来源的DataSource。
#下面为连接池的补充设置,应用到上面所有数据源中
#初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
#配置获取连接等待超时的时间
spring.datasource.maxWait=60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT1FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
#通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
#spring.datasource.useGlobalDataSourceStat=true
需要注意的是:spring.datasource.type旧的spring boot版本是不能识别的。
配置StatView的Servlet:
Filter的实现类:
[html]view plaincopy importjavax.servlet.annotation.WebFilter;importjavax.servlet.annotation.WebInitParam;importcom.alibaba.druid.support.http.WebStatFilter;@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",initParams={@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源})publicclassDruidStatFilterextendsWebStatFilter{}
StatViewServlet:
[html]view plaincopy importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importcom.alibaba.druid.support.http.StatViewServlet;@WebServlet(urlPatterns="/druid/*",initParams={@WebInitParam(name="allow",value="127.0.0.1,192.168.163.1"),//IP白名单(没有配置或者为空,则允许所有访问)@WebInitParam(name="deny",value="192.168.1.73"),//IP黑名单(存在共同时,deny优先于allow)@WebInitParam(name="loginUsername",value="admin"),//用户名@WebInitParam(name="loginPassword",value="123456"),//密码@WebInitParam(name="resetEnable",value="false")//禁用HTML页面上的“ResetAll”功能})publicclassDruidStatViewServletextendsStatViewServlet{privatestaticfinallongserialVersionUID=-2688872071445249539L;}
这两个类相当于在web.xml中声明了一个servlet, 等价于如下的配置信息(web.xml):
[html]view plaincopy <servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class></servlet><servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern></servlet-mapping>
filter的配置信息:
[html]view plaincopy <filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
然后相应的配置工作就完成了,直接启动即可看到相应的应用了。
4. 运行界面以及介绍
访问地址: http://192.168.163.1:8080/druid/index.html
5. 参考资料
/xiaoyu411502/article/details/51392237/questions/32833641/not-able-to-set-spring-datasource-type