spring cloud多模块项目框架搭建-集成druid连接池

第六章:spring cloud多模块项目框架搭建-集成druid连接池

 

本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块项目框架,并不是一个spring cloud的demo而已,提供分布式系统的开发规范限制,微服务注册中心,配置中心,负载均衡,熔断,redis缓存,分布式事务,kafka服务消息通信,系统安全(sql注入攻击,xxs攻击等等),多数据源切换,全局异常处理等等。

 目录顺风车:spring cloud多模块项目框架搭建:https://blog.csdn.net/lingyancangqiong/article/details/109841353

spring cloud多模块项目框架搭建-集成druid连接池_第1张图片

druid官方文档:常见问题 · alibaba/druid Wiki · GitHub

一.  什么是数据库连接池?

数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接是一种关键的有限的昂贵的资源,例如mysql默认支持100个同时连接,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,很耗时,这样造成系统的性能十分低下。

连接池的原理是在启动时按初始连接数创建一些连接对象存放起来,由连接池动态的管理,当程序需要连接数据库,由连接池分配给程序一个连接,程序直接使用这个连接去执行自己的数据库操作,不需要自己去创建连接的过程,使用完毕在归还给连接池,由此又少了关闭的操作。这样大大提高了数据库操作的时间,减少了系统开销。有兴趣的童靴可以去详细的看看数据库连接的具体操作,这里不在赘述。当有并发时,连接池中的连接不够使用,连接池会根据配置的最大连接数去创建连接,当使用完毕,长时间(配置的检查时间)无程序使用,连接池会关闭一些连接,恢复到最小连接数。我使用过此类的框架有老牌的DBCP,C3P0,还有我们今天说的druid。

二.  什么是druid?

druid是阿里巴巴计算平台事业部出品开源,为监控而生的一款数据库连接池。官方毫不隐讳的描述为Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,对于这点,连接池使用中基本无感,不是特别的去关注它,还真没啥感觉,也没和其他连接池框架做过对比,不过他的监控还是挺好用的。

三.  集成druid.

这里我们以dream-order系统为例,以上一章《 spring cloud多模块项目框架搭建-集成lombok》的代码为基础。

1.  dream的pom.xml加入maven依赖。

    
        1.2.3
    

    
    
        com.alibaba
        druid
        ${druid.version}
    

2.  dream-oder的pom.xml引入如下依赖:

 
    
        com.alibaba
        druid
        ${druid.version}
    

3.  编写dream-order-web下的application.yml配置文件,如果报无法识别myl文件,删掉其中的中文注释即可。我刚刚就出现这个问题,运行一次,再加回来就好了。

spring:
  # 数据库访问配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1/kazikazi?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull&useSSL=false
    username: user
    password: user
    # 下面为连接池的补充设置,应用到上面所有数据源中
    initialSize: 5
    minIdle: 5
    maxActive: 20
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,log4j2
    logSlowSql: true

4.  在dream-order-common下创建common包,再创建config包,编写DruidConfig配置类。

 

package com.dream.order.common.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * druid配置类
 *
 * @author renkj
 * 2020/11/24 20:08
 */
@Configuration
public class DruidConfig {

    private Logger logger = LoggerFactory.getLogger(DruidConfig.class);

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn}")
    private boolean testOnReturn;

    @Value("${spring.datasource.filters}")
    private String filters;

    @Value("${spring.datasource.logSlowSql}")
    private String logSlowSql;

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new StatViewServlet());
        reg.addUrlMappings("/druid/*");
        reg.addInitParameter("loginUsername", username);
        reg.addInitParameter("loginPassword", password);
        reg.addInitParameter("logSlowSql", logSlowSql);
        return reg;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        return filterRegistrationBean;
    }

    @Bean
    public DataSource druidDataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        datasource.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);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            logger.error("druid configuration initialization filter", e);
        }
        return datasource;
    }
}

5.  启动项目,访问:127.0.0.1:8888/druid/login.html 就能看到druid的登陆界面,登陆就可以看到监控界面啦。。。。。账号密码就是你配置的数据库账号密码。

spring cloud多模块项目框架搭建-集成druid连接池_第2张图片

6.  访问我们之前写的Mybatis测试代码,我们就可以看到监控页面会出现我们访问的URL和执行的sql,idea控制台也会打印Druid的执行信息

spring cloud多模块项目框架搭建-集成druid连接池_第3张图片

本章spring cloud多模块项目框架搭建-集成dread连接池到这里就全部结束了,这里以dream-order为例,dream-activity的集成也是一样操作一遍就行了,最好是先照着我的操作弄好dream-order系统,再自己去动手试试为dream-activity系统集成。本文没提到的问题,可以看文首的官方文档,里面列举了很多很多问题和解决办法。。。

 

本章代码我打成了压缩包放在蓝奏云了(链接:https://wws.lanzous.com/b01hu1rsf      密码:cugj),可以下载下来对照对照。

 

上面所写内容如有不足和纰漏,欢迎留言或私聊指正批评。如果需要转载,也是欢迎,不甚荣幸,但请把《spring cloud多模块项目框架搭建》这一系列博客全部一起转载,这一系列博客毕竟是个整体教程,如果别人只看到一部分,那就是个残次品,谢谢,鞠躬。

你可能感兴趣的:(spring,cloud,多模块框架搭建教程,项目架构,软件框架,spring,cloud,分布式)