Spring Boot系列文章之-使用 Druid 数据库连接池

导读

Spring Boot系列文章之-使用 Druid 数据库连接池,最近恰好最近用到Druid,就将Spring Boot 使用 Druid作为数据源做一个简单的介绍。

Druid介绍:

Druid是阿里巴巴开源的数据库连接池,Druid号称是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能,Druid的官方地址

了解更多:

JDBC连接池、监控组件 Druid 

快速上手:

下面来说明如何在 spring Boot 中配置使用Druid ,本例使用的持久层框为Spring Boot JPA。

第一步:添加pom依赖:

org.springframework.bootspring-boot-starter-data-jpacom.alibabadruid1.0.20

第二步:配置yml文件 数据源相关信息

spring:  datasource:      url:jdbc:mysql://localhost:3306/sanji-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false      username:root      password:123456      driver-class-name:com.mysql.jdbc.Driver      platform:mysql      type:com.alibaba.druid.pool.DruidDataSource# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大      initialSize:1      minIdle:3      maxActive:20# 配置获取连接等待超时的时间      maxWait:60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒      timeBetweenEvictionRunsMillis:60000# 配置一个连接在池中最小生存的时间,单位是毫秒      minEvictableIdleTimeMillis:30000      validationQuery:select'x'      testWhileIdle:true      testOnBorrow:false      testOnReturn:false# 打开PSCache,并且指定每个连接上PSCache的大小      poolPreparedStatements:true      maxPoolPreparedStatementPerConnectionSize:20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙      filters:stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录      connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 合并多个DruidDataSource的监控数据#useGlobalDataSourceStat: true  jpa:    show-sql:true    properties:      hibernate:        hbm2ddl:          auto:create

第三步:配置Druid的监控统计功能

这里有两种方式 :

第一种方式@Confing注解 配置类:

@ConfigurationpublicclassDruidConfiguration{privatestaticfinalLogger logger = LoggerFactory.getLogger(DruidConfiguration.class);privatestaticfinalString DB_PREFIX ="spring.datasource";@BeanpublicServletRegistrationBeandruidServlet(){        logger.info("init Druid Servlet Configuration ");        ServletRegistrationBean servletRegistrationBean =newServletRegistrationBean(newStatViewServlet(),"/druid/*");// IP白名单servletRegistrationBean.addInitParameter("allow","192.168.2.25,127.0.0.1");// IP黑名单(共同存在时,deny优先于allow)servletRegistrationBean.addInitParameter("deny","192.168.1.100");//控制台管理用户servletRegistrationBean.addInitParameter("loginUsername","admin");        servletRegistrationBean.addInitParameter("loginPassword","admin");//是否能够重置数据 禁用HTML页面上的“Reset All”功能servletRegistrationBean.addInitParameter("resetEnable","false");returnservletRegistrationBean;    }@BeanpublicFilterRegistrationBeanfilterRegistrationBean(){        FilterRegistrationBean filterRegistrationBean =newFilterRegistrationBean(newWebStatFilter());        filterRegistrationBean.addUrlPatterns("/*");        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");returnfilterRegistrationBean;    }//解决 spring.datasource.filters=stat,wall,log4j 无法正常注册进去@ConfigurationProperties(prefix = DB_PREFIX)classIDataSourceProperties{privateString url;privateString username;privateString password;privateString driverClassName;privateintinitialSize;privateintminIdle;privateintmaxActive;privateintmaxWait;privateinttimeBetweenEvictionRunsMillis;privateintminEvictableIdleTimeMillis;privateString validationQuery;privatebooleantestWhileIdle;privatebooleantestOnBorrow;privatebooleantestOnReturn;privatebooleanpoolPreparedStatements;privateintmaxPoolPreparedStatementPerConnectionSize;privateString filters;privateString connectionProperties;@Bean//声明其为Bean实例@Primary//在同样的DataSource中,首先使用被标注的DataSourcepublicDataSourcedataSource(){            DruidDataSource datasource =newDruidDataSource();            datasource.setUrl(url);            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(SQLException e) {                System.err.println("druid configuration initialization filter: "+ e);            }            datasource.setConnectionProperties(connectionProperties);returndatasource;        }publicStringgetUrl(){returnurl;        }publicvoidsetUrl(String url){this.url = url;        }publicStringgetUsername(){returnusername;        }publicvoidsetUsername(String username){this.username = username;        }publicStringgetPassword(){returnpassword;        }publicvoidsetPassword(String password){this.password = password;        }publicStringgetDriverClassName(){returndriverClassName;        }publicvoidsetDriverClassName(String driverClassName){this.driverClassName = driverClassName;        }publicintgetInitialSize(){returninitialSize;        }publicvoidsetInitialSize(intinitialSize){this.initialSize = initialSize;        }publicintgetMinIdle(){returnminIdle;        }publicvoidsetMinIdle(intminIdle){this.minIdle = minIdle;        }publicintgetMaxActive(){returnmaxActive;        }publicvoidsetMaxActive(intmaxActive){this.maxActive = maxActive;        }publicintgetMaxWait(){returnmaxWait;        }publicvoidsetMaxWait(intmaxWait){this.maxWait = maxWait;        }publicintgetTimeBetweenEvictionRunsMillis(){returntimeBetweenEvictionRunsMillis;        }publicvoidsetTimeBetweenEvictionRunsMillis(inttimeBetweenEvictionRunsMillis){this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;        }publicintgetMinEvictableIdleTimeMillis(){returnminEvictableIdleTimeMillis;        }publicvoidsetMinEvictableIdleTimeMillis(intminEvictableIdleTimeMillis){this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;        }publicStringgetValidationQuery(){returnvalidationQuery;        }publicvoidsetValidationQuery(String validationQuery){this.validationQuery = validationQuery;        }publicbooleanisTestWhileIdle(){returntestWhileIdle;        }publicvoidsetTestWhileIdle(booleantestWhileIdle){this.testWhileIdle = testWhileIdle;        }publicbooleanisTestOnBorrow(){returntestOnBorrow;        }publicvoidsetTestOnBorrow(booleantestOnBorrow){this.testOnBorrow = testOnBorrow;        }publicbooleanisTestOnReturn(){returntestOnReturn;        }publicvoidsetTestOnReturn(booleantestOnReturn){this.testOnReturn = testOnReturn;        }publicbooleanisPoolPreparedStatements(){returnpoolPreparedStatements;        }publicvoidsetPoolPreparedStatements(booleanpoolPreparedStatements){this.poolPreparedStatements = poolPreparedStatements;        }publicintgetMaxPoolPreparedStatementPerConnectionSize(){returnmaxPoolPreparedStatementPerConnectionSize;        }publicvoidsetMaxPoolPreparedStatementPerConnectionSize(intmaxPoolPreparedStatementPerConnectionSize){this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;        }publicStringgetFilters(){returnfilters;        }publicvoidsetFilters(String filters){this.filters = filters;        }publicStringgetConnectionProperties(){returnconnectionProperties;        }publicvoidsetConnectionProperties(String connectionProperties){this.connectionProperties = connectionProperties;        }    }}


第二种方式基于注解的配置:

首先在启动类上加上注解:@ServletComponentScan使Spring能够扫描到我们自己编写的servlet和filter。

//druid数据源状态监控.@WebServlet(urlPatterns ="/druid/*",    initParams = {// IP白名单 (没有配置或者为空,则允许所有访问)@WebInitParam(name ="allow", value ="192.168.1.72,127.0.0.1"),// IP黑名单 (存在共同时,deny优先于allow)@WebInitParam(name ="deny", value ="192.168.1.73"),// 用户名@WebInitParam(name ="loginUsername", value ="admin"),// 密码@WebInitParam(name ="loginPassword", value ="admin"),// 禁用HTML页面上的“Reset All”功能@WebInitParam(name ="resetEnable", value ="false")    })public class DruidStatViewServlet extends StatViewServlet {}

// druid过滤器. @WebFilter(filterName ="druidWebStatFilter", urlPatterns ="/*",    initParams = {// 忽略资源@WebInitParam(name ="exclusions", value ="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")    })publicclassDruidStatFilterextendsWebStatFilter{}

等应用启动后,可以访问地址:http://localhost:8080/druid/,登录之后,即可查看数据源及SQL统计等。 

效果图如下:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容