本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块项目框架,并不是一个spring cloud的demo而已,提供分布式系统的开发规范限制,微服务注册中心,配置中心,负载均衡,熔断,redis缓存,分布式事务,kafka服务消息通信,系统安全(sql注入攻击,xxs攻击等等),多数据源切换,全局异常处理等等。
目录顺风车:spring cloud多模块项目框架搭建:https://blog.csdn.net/lingyancangqiong/article/details/109841353
druid官方文档:常见问题 · alibaba/druid Wiki · GitHub
数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接是一种关键的有限的昂贵的资源,例如mysql默认支持100个同时连接,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,很耗时,这样造成系统的性能十分低下。
连接池的原理是在启动时按初始连接数创建一些连接对象存放起来,由连接池动态的管理,当程序需要连接数据库,由连接池分配给程序一个连接,程序直接使用这个连接去执行自己的数据库操作,不需要自己去创建连接的过程,使用完毕在归还给连接池,由此又少了关闭的操作。这样大大提高了数据库操作的时间,减少了系统开销。有兴趣的童靴可以去详细的看看数据库连接的具体操作,这里不在赘述。当有并发时,连接池中的连接不够使用,连接池会根据配置的最大连接数去创建连接,当使用完毕,长时间(配置的检查时间)无程序使用,连接池会关闭一些连接,恢复到最小连接数。我使用过此类的框架有老牌的DBCP,C3P0,还有我们今天说的druid。
druid是阿里巴巴计算平台事业部出品开源,为监控而生的一款数据库连接池。官方毫不隐讳的描述为Druid是Java语言中最好的数据库连接池,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的登陆界面,登陆就可以看到监控界面啦。。。。。账号密码就是你配置的数据库账号密码。
6. 访问我们之前写的Mybatis测试代码,我们就可以看到监控页面会出现我们访问的URL和执行的sql,idea控制台也会打印Druid的执行信息。
本章spring cloud多模块项目框架搭建-集成dread连接池到这里就全部结束了,这里以dream-order为例,dream-activity的集成也是一样操作一遍就行了,最好是先照着我的操作弄好dream-order系统,再自己去动手试试为dream-activity系统集成。本文没提到的问题,可以看文首的官方文档,里面列举了很多很多问题和解决办法。。。
本章代码我打成了压缩包放在蓝奏云了(链接:https://wws.lanzous.com/b01hu1rsf 密码:cugj),可以下载下来对照对照。
上面所写内容如有不足和纰漏,欢迎留言或私聊指正批评。如果需要转载,也是欢迎,不甚荣幸,但请把《spring cloud多模块项目框架搭建》这一系列博客全部一起转载,这一系列博客毕竟是个整体教程,如果别人只看到一部分,那就是个残次品,谢谢,鞠躬。