1 介绍
1.1数据库连接池介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个,通过数据库连接池能明显提高对数据库操作的性能。
在Java应用程序中,常用的数据库连接池有DBCP、C3P0、Proxool、Druid等
1.2 数据库连接池性能比较
参考:https://blog.csdn.net/u011389515/article/details/76578129
1.3 Druid介绍
Druid 是阿里开源的一个JDBC应用组件,提供了非常优秀的数据库监控和扩展功能。
网址:Druid:https://github.com/alibaba/druid/
2集成
2.1加入依赖
<!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency>
2.2 添加配置
修改配置文件,将原有的数据源配置替换成Druid数据源并配置数据源相关参数。
spring:datasource:name: druidDataSourcetype: com.alibaba.druid.pool.DruidDataSourcedruid:# JDBC 配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8username: rootpassword: rootfilters: stat,wall# filters: stat,wall,log4j,config#连接池配置max-active: 100initial-size: 1max-wait: 60000min-idle: 1time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: select 'x'test-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-open-prepared-statements: 50max-pool-prepared-statement-per-connection-size: 20
2.3 自定义属性配置
如果需要通过定制的配置文件对Druid进行自定义属性配置,添加配置类如下:
edu.xja.config 包下新建一个DruidDataSourceProperties 类
/*** 数据源属性*/@ConfigurationProperties(prefix = "spring.datasource.druid")public class DruidDataSourceProperties {// jdbcprivate String driverClassName;private String url;private String username;private String password;// jdbc connection poolprivate int initialSize;private int minIdle;private int maxActive = 100;private long maxWait;private long timeBetweenEvictionRunsMillis;private long minEvictableIdleTimeMillis;private String validationQuery;private boolean testWhileIdle;private boolean testOnBorrow;private boolean testOnReturn;private boolean poolPreparedStatements;private int maxPoolPreparedStatementPerConnectionSize;// filterprivate String filters;public int getInitialSize() {return initialSize;}public void setInitialSize(int initialSize) {this.initialSize = initialSize;}public int getMinIdle() {return minIdle;}public void setMinIdle(int minIdle) {this.minIdle = minIdle;}public int getMaxActive() {return maxActive;}public void setMaxActive(int maxActive) {this.maxActive = maxActive;}public long getMaxWait() {return maxWait;}public void setMaxWait(long maxWait) {this.maxWait = maxWait;}public long getTimeBetweenEvictionRunsMillis() {return timeBetweenEvictionRunsMillis;}public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;}public long getMinEvictableIdleTimeMillis() {return minEvictableIdleTimeMillis;}public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;}public String getValidationQuery() {return validationQuery;}public void setValidationQuery(String validationQuery) {this.validationQuery = validationQuery;}public boolean isTestWhileIdle() {return testWhileIdle;}public void setTestWhileIdle(boolean testWhileIdle) {this.testWhileIdle = testWhileIdle;}public boolean isTestOnBorrow() {return testOnBorrow;}public void setTestOnBorrow(boolean testOnBorrow) {this.testOnBorrow = testOnBorrow;}public boolean isTestOnReturn() {return testOnReturn;}public void setTestOnReturn(boolean testOnReturn) {this.testOnReturn = testOnReturn;}public boolean isPoolPreparedStatements() {return poolPreparedStatements;}public void setPoolPreparedStatements(boolean poolPreparedStatements) {this.poolPreparedStatements = poolPreparedStatements;}public int getMaxPoolPreparedStatementPerConnectionSize() {return maxPoolPreparedStatementPerConnectionSize;}public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;}public String getFilters() {return filters;}public void setFilters(String filters) {this.filters = filters;}public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}
2.4 config包下配置Servlet和Filter
Config包下新建一个DruidConfig配置类,主要是注入属性和配置连接池相关的配置,如黑白名单、监控管理后台登录账户密码等
/*** Druid数据源配置*/@Configuration@EnableConfigurationProperties({DruidDataSourceProperties.class})public class DruidConfig {@Autowiredprivate DruidDataSourceProperties properties;@Bean@ConditionalOnMissingBeanpublic DataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(properties.getDriverClassName());druidDataSource.setUrl(properties.getUrl());druidDataSource.setUsername(properties.getUsername());druidDataSource.setPassword(properties.getPassword());druidDataSource.setInitialSize(properties.getInitialSize());druidDataSource.setMinIdle(properties.getMinIdle());druidDataSource.setMaxActive(properties.getMaxActive());druidDataSource.setMaxWait(properties.getMaxWait());druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());druidDataSource.setValidationQuery(properties.getValidationQuery());druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());druidDataSource.setTestOnReturn(properties.isTestOnReturn());druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());try {druidDataSource.setFilters(properties.getFilters());druidDataSource.init();} catch (SQLException e) {e.printStackTrace();}return druidDataSource;}/*** 注册Servlet信息, 配置监控视图** @return*/@Bean@ConditionalOnMissingBeanpublic ServletRegistrationBean<Servlet> druidServlet() {ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");//白名单:// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.servletRegistrationBean.addInitParameter("deny","192.168.1.119");//登录查看信息的账号密码, 用于登录Druid监控后台servletRegistrationBean.addInitParameter("loginUsername", "admin");servletRegistrationBean.addInitParameter("loginPassword", "admin");//是否能够重置数据.servletRegistrationBean.addInitParameter("resetEnable", "true");return servletRegistrationBean;}/*** 注册Filter信息, 监控拦截器** @return*/@Bean@ConditionalOnMissingBeanpublic FilterRegistrationBean<Filter> filterRegistrationBean() {FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();filterRegistrationBean.setFilter(new WebStatFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;}}
3 查看监控
3.1 登录页面
http://localhost:9999/druid/login.html
3.2监控首页

