Spring Boot系列(九) 使用Druid连接池

来源:互联网 发布:linux 2030端口 编辑:程序博客网 时间:2024/04/26 23:40
Druid是阿里巴巴的开源项目,根据其官网介绍,Druid是Java语言中最好的数据库连接池,它能够提供强大的监控和扩展功能。下面介绍在Spring Boot中使用其强大功能步骤(采用JavaConfig)(Spring Boot默认使用 org.apache.tomcat.jdbc.pool.DataSource作为数据库库连接池):
  1. 在IDE中添加Druid依赖
<dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.0.25</version></dependency>


2. 添加数据库连接池配置信息
参考DataSourceProperties类中的属性来配置数据库连接池信息:

# 数据库访问配置 :通常来说,只需要修改initialSize、minIdle、maxActive。# 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。## 主数据源,默认的,1.4中没有spring.datasource.type属性#spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://192.168.1.88:3306/spring_cloud?useUnicode\=true&characterEncoding\=utf-8spring.datasource.username=rootspring.datasource.password=root# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大spring.datasource.initialSize=5spring.datasource.minIdle=5spring.datasource.maxActive=20# 配置获取连接等待超时的时间spring.datasource.maxWait=60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000# 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000#spring.datasource.validationQuery=SELECT 1 FROM DUALspring.datasource.validationQuery=SELECT 'x'spring.datasource.testWhileIdle=truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=false# 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.poolPreparedStatements=truespring.datasource.maxPoolPreparedStatementPerConnectionSize=20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙(防止SQL注入) 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


3. 创建DruidConfiguration配置类
由于在Spring Boot 1.4版本中,移除了spring.datasource.type属性,如果需要因为第三方数据源,需要手动添加DataSource,这样自动配置的DataSource就不会加载了。同时开启SQL监控和防御SQL注入攻击功能:

@Configuration@EnableConfigurationProperties(DataSourceProperties.class)public class DruidConfiguration{    @Bean    @ConfigurationProperties("spring.datasource.*")    public DruidDataSource dataSource(DataSourceProperties properties) {        DruidDataSource dataSource = new DruidDataSource();        dataSource.setDriverClassName(properties.determineDriverClassName());        dataSource.setUrl(properties.determineUrl());        dataSource.setUsername(properties.determineUsername());        dataSource.setPassword(properties.determinePassword());        DatabaseDriver databaseDriver = DatabaseDriver                .fromJdbcUrl(properties.determineUrl());        String validationQuery = databaseDriver.getValidationQuery();        if (validationQuery != null) {            dataSource.setTestOnBorrow(true);            dataSource.setValidationQuery(validationQuery);        }        try {            //开启Druid的监控统计功能,mergeStat代替stat表示sql合并,wall表示防御SQL注入攻击            dataSource.setFilters("mergeStat,wall,log4j");        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return dataSource;    }}


4. 展示监控界面
Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。这个StatViewServlet的用途包括:
- 提供监控信息展示的html页面
- 提供监控信息的JSON API
注意:使用StatViewServlet,建议使用druid 0.2.6以上版本。
在DruidConfiguration类中添加StatViewServlet的注册:

/** * 注册一个Druid内置的StatViewServlet,用于展示Druid的统计信息。 * @return */ @Bean public ServletRegistrationBean DruidStatViewServlet(){    //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");    //添加初始化参数:initParams    //白名单 (没有配置或者为空,则允许所有访问)    servletRegistrationBean.addInitParameter("allow","192.168.1.88,127.0.0.1");    //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.    servletRegistrationBean.addInitParameter("deny","192.168.1.80");    //登录查看信息的账号密码.    servletRegistrationBean.addInitParameter("loginUsername","root");    servletRegistrationBean.addInitParameter("loginPassword","123456");    //是否能够重置数据(禁用HTML页面上的“Reset All”功能)    servletRegistrationBean.addInitParameter("resetEnable","false");    return servletRegistrationBean;}


5. Web关联监控配置
WebStatFilter用于采集web-jdbc关联监控的数据。在DruidConfiguration中配置

/** * 注册一个:filterRegistrationBean,添加请求过滤规则 * @return */@Beanpublic FilterRegistrationBean druidStatFilter(){    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());    //添加过滤规则.    filterRegistrationBean.addUrlPatterns("/*");    //添加不需要忽略的格式信息.    filterRegistrationBean.addInitParameter(        "exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*");    return filterRegistrationBean;}


6. Spring关联监控配置
Druid提供了Spring和Jdbc的关联监控。com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一个标准的Spring MethodInterceptor。可以灵活进行AOP配置。在DruidConfiguration中配置:

/** * 监听Spring *  1.定义拦截器 *  2.定义切入点 *  3.定义通知类 * @return */@Beanpublic DruidStatInterceptor druidStatInterceptor(){    return new DruidStatInterceptor();}@Beanpublic JdkRegexpMethodPointcut druidStatPointcut(){    JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();    String patterns = "com.ft.*.*.service.*";    String patterns2 = "com.ft.*.*.mapper.*";      druidStatPointcut.setPatterns(patterns,patterns2);    return druidStatPointcut;}@Beanpublic Advisor druidStatAdvisor() {    return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());}


7. Druid使用常见问题
详见:https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98


0 0