예를 들어 C3P0,DBCP,hikari, Druid
HikariCP는 약간 빠르지만 Druid는 강력한 모니터링 및 확장 기능을 제공할 수 있으며 Alibaba의 오픈 소스 프로젝트이기도 합니다.
Druid는 Monitoring으로 알려진 Alibaba에서 개발한 데이터베이스 연결 풀로 기능, 성능 및 확장성 등에서 다른 데이터베이스 연결 풀을 능가하며 모든 것을 몇 초 만에 죽입니다 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource
.
Druid는 DB 풀 연결 및 SQL 실행을 매우 잘 모니터링할 수 있으며 모니터링을 위한 DB 연결 풀입니다.
Spring Boot의 기본 데이터 소스는 Spring Boot 2.x에서 기본적으로 Hikari 데이터 소스를 사용한다고 소개 HikariDataSource
했는데 JdbcTemplate
, Hikari와 Driud는 Java Web에서 가장 좋은 데이터 소스라고 할 수 있습니다.
그리고 Druid는 몇 년 동안 생산 환경에서 대규모 배포에 대한 엄격한 테스트를 거친 후 Alibaba에 600개 이상의 애플리케이션을 배포했습니다!
-
stat:
StatFilter
Druid는 통계 모니터링 정보를 위한 내장 기능을 제공합니다 . -
wall: SQL 삽입 공격에 대한 Druid의 방어는
WallFilter
Druid의 SQL Parser 분석을 통해 이루어집니다. Druid는SQL Parser
하위 데이터베이스 하위 테이블, 감사 등과 같은 해당 처리를 위해 JDBC 계층에서 SQL을 가로챌 수 있습니다. -
log4j2: 문제 해결을 위해 log4j2에 SQL 문을 인쇄할 수 있는 로깅 기능입니다.
1. 관련 구성
1.1 종속성 추가
<properties>
<java.version>1.8</java.version>
<alibabaDruidStarter.version>1.2.11</alibabaDruidStarter.version>
</properties>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${alibabaDruidStarter.version}</version>
</dependency>
1.2 구성 속성
-
Druid 데이터 소스(연결 풀) 구성: c3p0 및 dbcp 데이터 소스가 데이터 소스 연결 초기화 크기, 최대 연결 수, 대기 시간, 최소 연결 수 등을 설정할 수 있는 것과 마찬가지로 Druid 데이터 소스도 동일한 방식으로 설정할 수 있습니다. .
-
Druid 웹 모니터링 필터(WebStatFilter) 구성: 이 필터의 기능은 웹 애플리케이션 요청에서 발행된 sql 문, sql 실행 시간, 요청 수, 요청된 url 주소 및 seesion 모니터링, 데이터베이스 테이블과 같은 모든 데이터베이스 정보를 카운트하는 것입니다. 방문 등
-
Druid 백그라운드 관리 서블릿 구성(StatViewServlet): Druid 데이터 소스에는 모니터링 기능이 있으며 사용자가 볼 수 있는 웹 인터페이스를 제공합니다. 라우터를 설치할 때와 마찬가지로 기본 웹 페이지도 제공하므로 Druid 백그라운드를 설정해야 합니다. 관리 페이지 로그인 계정, 비밀번호 등과 같은 속성
[참고]: 구성 속성의 이름은 Druid를 완전히 따릅니다.Druid 데이터베이스 연결 풀을 구성하고 Spring Boot 구성 파일을 통해 모니터링할 수 있습니다.구성이 없으면 기본값을 사용하십시오. Druid Spring Boot Starter
다음과 같이 application.yml
관련 속성을 구성하십시오 .
# spring 配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
password: 123456
username: root
url: jdbc:mysql://localhost:3306/superjson?useUnicode=true&characterEncoding=utf8&useSSL=false
# 连接池配置
druid:
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM user
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开 PSCache,并且指定每个连接上 PSCache 的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
filters: stat,wall,slf4j
# 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置 DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
# 配置 DruidStatViewServlet
stat-view-servlet:
url-pattern: /druid/*
# IP 白名单,没有配置或者为空,则允许所有访问
allow: 127.0.0.1
# IP 黑名单,若白名单也存在,则优先使用
deny: 192.168.31.253
# 禁用 HTML 中 Reset All 按钮
reset-enable: false
# 登录用户名/密码
login-username: root
login-password: 123456
# 需要设置enabled=true,否则会报出There was an unexpected error (type=Not Found, status=404).错误,或者将druid-spring-boot-starter的版本降低到1.1.10及以下
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
enabled: true
위 구성 파일의 매개변수는 com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties
및 에서 찾을 수 있습니다 org.springframework.boot.autoconfigure.jdbc.DataSourcePropertie
.
1.3 필터 구성
spring.datasource.druid.filters=stat,wall,log4j ...
해당 내장 필터는 메서드를 통해 활성화할 수 있지만 이러한 필터는 모두 기본 구성입니다. 기본 구성이 요구 사항을 충족하지 못하는 경우 이 방법을 포기하고 다음과 같이 구성 파일을 통해 필터를 구성할 수 있습니다.
# 配置StatFilter
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
# 配置WallFilter
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false
spring.datasource.druid.filter.*
현재 ( )에 따라 구성된 다음 필터에 대한 구성 지원이 제공됩니다 .
-
StatFilter
-
월필터
-
구성 필터
-
인코딩 변환 필터
-
Slf4jLogFilter
-
Log4jFilter
-
Log4j2Filter
-
CommonsLogFilter
기본 제공 필터를 사용하지 않으려면 해당 필터의 활성화를 참으로 설정하여 사용자 지정 필터 구성을 적용해야 합니다.StatFilter는 기본적으로 비활성화되어 있으며 활성화를 활성화하려면 활성화를 참으로 설정할 수 있습니다 Druid Spring Boot Starter
.
2. 모니터링 페이지
2.1 프로젝트를 시작한 후 http://localhost:8081/druid/login.html
로그인 페이지에 액세스하고 아래와 같이 사용자 이름과 비밀번호를 입력하여 로그인합니다.
2.2 데이터 소스 페이지는 현재 DataSource 구성의 기본 정보로 위에서 설정한 Filter를 찾을 수 있으며, Filter를 설정하지 않은 경우(일부 정보는 집계되지 않음, 예를 들어 SQL 모니터링에서 JDBC를 얻을 수 없음) 관련 SQL 실행 정보)
2.3 모든 SQL 문의 실행을 카운트하는 SQL 모니터링 페이지
2.4 모든 컨트롤러 인터페이스의 액세스 및 실행을 계산하는 URL 모니터링 페이지
2.5 지정된 인터페이스의 실행 시간 및 jdbc 번호를 기록하기 위해 aop를 사용하는 Spring 모니터링 페이지
2.6 SQL 방화벽 페이지
Druid는 블랙리스트와 화이트리스트에 대한 액세스를 제공하며 SQL 보호 상황을 명확하게 볼 수 있습니다.
2.7 세션 모니터링 페이지
현재 세션 상태, 생성 시간, 마지막 활성 시간, 요청 수 및 요청 시간과 같은 세부 매개 변수를 볼 수 있습니다.
2.8 JSON API 페이지
api 형태로 Druid의 모니터링 인터페이스에 접근하고, api 인터페이스는 Json 형태로 데이터를 반환합니다.
3. SQL 모니터링
Druid 웹 모니터링 필터( WebStatFilter
)를 구성하여 웹 애플리케이션 요청에서 SQL 문 실행, SQL 실행 시간, 요청 수, 요청 URL 주소 및 Seesion 모니터링, 데이터베이스 테이블 액세스 시간, 구성 등 모든 데이터베이스 정보를 계산하는 데 사용됩니다. 다음과 같이:
spring:
datasource:
druid:
########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
web-stat-filter:
enabled: true # 启动 StatFilter
url-pattern: /* # 过滤所有url
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url
session-stat-enable: true # 开启session统计功能
session-stat-max-count: 1000 # session的最大个数,默认100
4. 느린 SQL 레코드
때때로 시스템의 일부 SQL이 매우 느리게 실행되고 이를 기록하기 위해 로그를 사용하려는 경우 Druid의 느린 SQL 기록 기능을 활성화하고 다음과 같이 구성할 수 있습니다.
spring:
datasource:
druid:
filter:
stat:
enabled: true # 开启DruidDataSource状态监控
db-type: mysql # 数据库的类型
log-slow-sql: true # 开启慢SQL记录功能
slow-sql-millis: 2000 # 默认3000毫秒,这里超过2s,就是慢,记录到日志
시작 후 느린 SQL이 발생하면 로그에 출력됩니다.
5. 스프링 모니터링
액세스 후 스프링 모니터링에는 기본적으로 데이터가 없지만 다음과 같이 SprngBoot의 AOP Starter를 가져와야 합니다.
<!--SpringBoot 的aop 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
동시에 application.yml에서 다음과 같이 구성해야 합니다.
com.springboot.template.dao.*
Spring은 쉼표로 구분된 여러 영어 구성 과 같은 AOP 진입점을 모니터링합니다.
spring.datasource.druid.aop-patterns="com.springboot.template.dao.*"
6. 광고 제거(Ad)
모니터링 페이지를 방문하면 아래와 같이 페이지 하단(바닥글)에 Alibaba의 광고가 표시될 수 있습니다.
이유: 가져온 druid jar 패키지의 common.js(페이지 바닥글에 광고를 추가하기 위한 js 코드가 있음)
제거하려면 두 가지 방법이 있습니다.
6.1 이 코드를 직접 수동으로 주석 처리
Maven을 사용하는 경우 로컬 웨어하우스로 직접 이동하여 jar 패키지를 찾고 다음 코드를 주석 처리합니다.
// this.buildFooter();
common.js의 위치:
com/alibaba/druid/1.1.23/druid-1.1.23.jar!/support/http/resources/js/common.js
6.2 필터로 필터링
common.js
다음 코드와 같이 필터를 등록하고 요청을 필터링 하고 정규식을 사용하여 관련 광고 콘텐츠를 교체합니다.
@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled",
havingValue = "true", matchIfMissing = true)
public class RemoveDruidAdConfig {
/**
* 方法名: removeDruidAdFilterRegistrationBean
* 方法描述 除去页面底部的广告
* @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties
* @return org.springframework.boot.web.servlet.FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) {
// 获取web监控页面的参数
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
// 提取common.js的配置路径
String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
final String filePath = "support/http/resources/js/common.js";
//创建filter进行过滤
Filter filter = new Filter() {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
// 重置缓冲区,响应头不会被重置
response.resetBuffer();
// 获取common.js
String text = Utils.readFromResource(filePath);
// 正则替换banner, 除去底部的广告信息
text = text.replaceAll("<a.*?banner\"></a><br/>", "");
text = text.replaceAll("powered.*?shrek.wang</a>", "");
response.getWriter().write(text);
}
@Override
public void destroy() {}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(commonJsPattern);
return registrationBean;
}
}
두 가지 방법을 모두 사용할 수 있으며 근본 원인에서 문제를 해결하려면 첫 번째 방법을 사용하는 것이 좋습니다.
7. Druid 모니터링 데이터 얻기
Druid의 모니터링 데이터는 다음을 사용 StatFilter
하여 얻을 수 있습니다 DruidStatManagerFacade
.
DruidStatManagerFacade#getDataSourceStatDataList
이 방법은 모든 데이터 소스에서 모니터링 데이터를 얻을 수 있으며, DruidStatManagerFacade
필요에 따라 선택하여 사용할 수 있는 몇 가지 다른 방법이 제공됩니다.
@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {
@GetMapping("/stat")
public Object druidStat(){
// 获取数据源的监控数据
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}