失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Spring Boot下Druid连接池的使用配置分析

Spring Boot下Druid连接池的使用配置分析

时间:2020-11-17 22:28:10

相关推荐

Spring Boot下Druid连接池的使用配置分析

引言: 在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

如果觉得《Spring Boot下Druid连接池的使用配置分析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。