南通网站制作哪个好,什么是网站优化,网页制作与网站建设宝典(第2版),完美动力培训机构一、概述
1.1简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现#xff0c;结合了 C3P0、DBCP 等 DB 池的优点#xff0c;同时加入了日志监控。 它本身还自带一个监控平台#xff0c;可以查看时时产生的sql、uri等监控数据#xff0c;可以排查慢sql、慢请求#xff0…一、概述
1.1简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现结合了 C3P0、DBCP 等 DB 池的优点同时加入了日志监控。 它本身还自带一个监控平台可以查看时时产生的sql、uri等监控数据可以排查慢sql、慢请求方便对sql和项目代码进行调优。 com.alibaba.druid.pool.DruidDataSource 基本配置参数如下 配置 缺省值 说明 name 配置这个属性的意义在于如果存在多个数据源监控的时候可以通过名字来区分开来。 如果没有配置将会生成一个名字格式是DataSource- System.identityHashCode(this) jdbcUrl 连接数据库的url不同数据库不一样。例如 mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:10.20.149.85:1521:ocnauto username 连接数据库的用户名 password 连接数据库的密码。如果你不希望密码直接写在配置文件中可以使用ConfigFilter。详细看这里https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter driverClassName 根据url自动识别 这一项可配可不配如果不配置druid会根据url自动识别dbType然后选择相应的driverClassName(建议配置下) initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法或者第一次getConnection时 maxActive 8 最大连接池数量 maxIdle 8 已经不再使用配置了也没效果 minIdle 最小连接池数量 maxWait 获取连接时最大等待时间单位毫秒。配置了maxWait之后缺省启用公平锁并发效率会有所下降如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 poolPreparedStatements false 是否缓存preparedStatement也就是PSCache。PSCache对支持游标的数据库性能提升巨大比如说oracle。在mysql下建议关闭。 maxOpenPreparedStatements -1 要启用PSCache必须配置大于0当大于0时poolPreparedStatements自动触发修改为true。在Druid中不会存在Oracle下PSCache占用内存过多的问题可以把这个数值配置大一些比如说100 validationQuery 用来检测连接是否有效的sql要求是一个查询语句。如果validationQuery为nulltestOnBorrow、testOnReturn、testWhileIdle都不会其作用。 testOnBorrow true 申请连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。 testOnReturn false 归还连接时执行validationQuery检测连接是否有效做了这个配置会降低性能 testWhileIdle false 建议配置为true不影响性能并且保证安全性。申请连接的时候检测如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效。 timeBetweenEvictionRunsMillis 有两个含义 1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据详细看testWhileIdle属性的说明 numTestsPerEvictionRun 不再使用一个DruidDataSource只支持一个EvictionRun minEvictableIdleTimeMillis connectionInitSqls 物理连接初始化的时候执行的sql exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时抛弃连接 filters 属性类型是字符串通过别名的方式配置扩展插件常用的插件有 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall proxyFilters 类型是Listcom.alibaba.druid.filter.Filter如果同时配置了filters和proxyFilters是组合关系并非替换关系 1.2数据库连接池 数据库连接池是一种用于管理和复用数据库连接的技术。在应用程序与数据库之间建立连接是一项开销较大的操作而连接池的目标是通过预先建立一组数据库连接然后在应用程序需要时分配和复用这些连接以减少连接建立和断开的开销提高数据库访问的效率和性能。 相关依赖
!--Druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.20/version/dependency!--springboot整合druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.20/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependency
相关配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://122.9.47.93:3306/username:password: type: com.alibaba.druid.pool.DruidDataSource
配置类
package com.yanyu.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.alibaba.druid.support.jakarta.StatViewServlet;
import com.alibaba.druid.support.jakarta.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 org.springframework.context.annotation.Primary;import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;Configuration
public class MyDataSourceConfig {ConfigurationProperties(prefix spring.datasource)BeanPrimarypublic DruidDataSource druid() throws SQLException {DruidDataSource dataSource new DruidDataSource();dataSource.setUrl(jdbc:mysql://122.9.47.93:3306/2021213067);dataSource.setName();dataSource.setPassword();dataSource.setInitialSize(7); // 初始化连接数dataSource.setMinIdle(5); // 最小空闲连接数dataSource.setMaxActive(22); // 最大活跃连接数dataSource.setMaxWait(60000); // 获取连接的最大等待时间毫秒dataSource.setTimeBetweenEvictionRunsMillis(60000); // 连接回收的时间间隔毫秒dataSource.setMinEvictableIdleTimeMillis(300000); // 连接在池中保持空闲的最小时间毫秒dataSource.setValidationQuery(SELECT 1 FROM DUAL); // 验证连接是否有效的 SQL 语句dataSource.setTestWhileIdle(true); // 当连接空闲时是否进行有效性检测dataSource.setTestOnBorrow(false); // 当从连接池借用连接时是否进行有效性检测dataSource.setTestOnReturn(false); // 当归还连接时是否进行有效性检测dataSource.setPoolPreparedStatements(true); // 是否使用预处理语句//dataSource.setFilters(stat,wall,log4j); // 配置监控统计拦截的 filtersdataSource.setMaxPoolPreparedStatementPerConnectionSize(20); // 每个连接最多可以创建的预处理语句数量dataSource.setUseGlobalDataSourceStat(true); // 是否使用全局数据源统计信息dataSource.setConnectionProperties(druid.stat.mergeSqltrue;druid.stat.slowSqlMillis500); // 连接属性配置return dataSource;}Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean registrationBean new ServletRegistrationBean();registrationBean.setServlet(new StatViewServlet());registrationBean.setUrlMappings(Arrays.asList(/druid/*));//设置初始化参数MapString,String initMap new HashMap();initMap.put(loginUsername,admin);initMap.put(loginPassword,123456);initMap.put(allow,);initMap.put(deny,192.168.2.110);registrationBean.setInitParameters(initMap);return registrationBean;}Beanpublic FilterRegistrationBean webStatFilter(){FilterRegistrationBean registrationBean new FilterRegistrationBean();registrationBean.setFilter(new WebStatFilter());registrationBean.setUrlPatterns(Arrays.asList(/*));//设置初始化参数MapString,String initMap new HashMap();initMap.put(exclusions,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*);registrationBean.setInitParameters(initMap);return registrationBean;}}测试
package com.yanyu.config;import com.alibaba.druid.pool.DruidDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;SpringBootTest
class SpringbootDataJdbcApplicationTests { //DI注入数据源AutowiredDataSource dataSource;Testpublic void contextLoads() throws SQLException { //看一下默认数据源System.out.println(dataSource.getClass()); //获得连接Connection connection dataSource.getConnection();System.out.println(connection);DruidDataSource druidDataSource (DruidDataSource) dataSource;System.out.println(druidDataSource 数据源最大连接数 druidDataSource.getMaxActive());System.out.println(druidDataSource 数据源初始化连接数 druidDataSource.getInitialSize());//关闭连接connection.close();}
}1.3Druid数据源监控
Druid 数据源具有监控的功能并提供了一个 web 界面方便用户查看类似安装 路由器 时人家也提供了一个默认的 web 页面。
1 设置 Druid 的后台管理页面 如 登录账号、密码 等
//配置 Druid 监控管理后台的Servlet
//内置 Servlet 容器时没有web.xml文件所以使用 Spring Boot 的注册 Servlet 方式
Bean
public ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean new ServletRegistrationBean(new StatViewServlet(), /druid/*);// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到MapString, String initParams new HashMap();//参数指定 loginUsername loginPassword 不可变initParams.put(loginUsername, admin); //后台管理界面的登录账号initParams.put(loginPassword, 123456); //后台管理界面的登录密码//后台允许谁可以访问//initParams.put(allow, localhost)表示只有本机可以访问//initParams.put(allow, )为空或者为null时表示允许所有访问initParams.put(allow, );//denyDruid 后台拒绝谁访问//initParams.put(kuangshen, 192.168.1.20);表示禁止此ip访问//设置初始化参数bean.setInitParameters(initParams);return bean;
}2 访问管理后台
配置完毕后访问管理后台: http://localhost:8080/druid/login.html
配置 Druid web 监控 filter 过滤器 – 过滤不需要监控的数据 //配置 Druid 监控 之 web 监控的 filter
//WebStatFilter用于配置Web和Druid数据源之间的管理关联监控统计
Bean
public FilterRegistrationBean webStatFilter() {FilterRegistrationBean bean new FilterRegistrationBean();bean.setFilter(new WebStatFilter());//exclusions设置哪些请求进行过滤排除掉从而不进行统计MapString, String initParams new HashMap();initParams.put(exclusions, *.js,*.css,/druid/*,/jdbc/*);bean.setInitParameters(initParams);///* 表示过滤所有请求bean.setUrlPatterns(Arrays.asList(/*));return bean;
}二、druid使用指南
2.1数据源
在数据源这里可以看到连接池的情况包括配置文件中配置的连接数等参数以及没有配置的一些默认参数。 数据源的下半部分可以看到一些时时产生的数据这些参数都附带了解释一些重要的数据有
等待线程数量 当前等待获取连接的线程数事务启动数 事务开始的个数事务时间分布 事务运行时间分布分布区间为[0-10 ms, 10-100 ms, 100-1 s, 1-10 s, 10-100 s, 100 s]池中连接数峰值 连接池中数目的峰值活跃连接数 当前连接池中活跃连接数执行数 所有连接执行的任务数事务回滚数 事务失败回滚的次数连接持有时间分布连接持有时间分布分布区间为[0-1 ms, 1-10 ms, 10-100 ms, 100ms-1s, 1-10 s, 10-100 s, 100-1000 s, 1000 s] 2.2SQL监控 我们在配置文件中配置了慢sql的执行时间为3秒钟这里会将超过3秒钟的sql标红方便我们一眼就看到。可以从下图看到有两个mansql并把sql显示了出来我们可以针对性的进行sql优化。 执行分布时间一共有8个档位在上述数据源里已经看到了这8个档位的含义。 可以看到最大并发数是40这是因为在配置文件中配置了最大连接数为40可以根据实际情况调整参数。 点击左侧蓝色的sql可以查看更详细的视图。 2.3SQL防火墙 记录配置文件中配置的黑、白名单的拦截信息我这里没有配也没有数据。 2.4 web应用
可以看到整个项目的运行数据主要记录的还是和数据库打交道的一些数据。 2.5 URI监控 有不少中间件都能实现对于URI的监控sentinel、skywalking、zipkin等德鲁伊侧重的是和数据库连接产生的数据可以结合多个监控的数据一起参考。