From d3f5aa4f1931c77e871c6ab3faf00a951467c16f Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Tue, 6 Aug 2024 20:26:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DruidFilter=E8=AE=B0=E5=BD=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nladmin-system/nlsso-server/pom.xml | 1 - .../main/java/org/nl/config/DruidFilter.java | 88 +++++++++++++++++++ .../nl/config/mybatis/MybatisPlusConfig.java | 2 + .../META-INF/druid-filter.properties | 1 + .../src/main/resources/config/application.yml | 25 +++++- 5 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java create mode 100644 nladmin-system/nlsso-server/src/main/resources/META-INF/druid-filter.properties diff --git a/nladmin-system/nlsso-server/pom.xml b/nladmin-system/nlsso-server/pom.xml index b86e284..f310356 100644 --- a/nladmin-system/nlsso-server/pom.xml +++ b/nladmin-system/nlsso-server/pom.xml @@ -205,7 +205,6 @@ mysql mysql-connector-java - runtime diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java new file mode 100644 index 0000000..f2ebd78 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/DruidFilter.java @@ -0,0 +1,88 @@ +package org.nl.config; + +import com.alibaba.druid.filter.FilterChain; +import com.alibaba.druid.filter.FilterEventAdapter; +import com.alibaba.druid.proxy.jdbc.JdbcParameter; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; +import com.alibaba.druid.proxy.jdbc.ResultSetProxy; +import com.alibaba.druid.proxy.jdbc.StatementProxy; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcUtils; +import com.mysql.cj.jdbc.result.ResultSetImpl; +import lombok.extern.slf4j.Slf4j; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/* + * @author ZZQ + * @Date 2023/2/10 11:27 上午 + */ +@Slf4j +public class DruidFilter extends FilterEventAdapter { + + @Override + public int preparedStatement_executeUpdate(FilterChain chain, PreparedStatementProxy statement) throws SQLException { + + return super.preparedStatement_executeUpdate(chain, statement); + } + + @Override + public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql) throws SQLException { + + return super.statement_executeUpdate(chain, statement, sql); + } + + @Override + protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) { + int size = statement.getParametersSize(); + String executeSql = sql; + int count = 0; + try { + count = statement.getUpdateCount(); + } catch (Exception ex) { + } + if (count > 0) { + if (size > 0) { + Collection values = statement.getParameters().values(); + List params = new ArrayList<>(); + for (JdbcParameter value : values) { + params.add(value.getValue()); + } + executeSql = SQLUtils.format(executeSql, JdbcUtils.MYSQL, params); + } + log.info("[----SQL----][update][ SQL: {} ]", executeSql); + } + super.statementExecuteAfter(statement, sql, result); + } + + @Override + public ResultSetProxy statement_getResultSet(FilterChain chain, StatementProxy statement) throws SQLException { + ResultSetProxy rs = super.statement_getResultSet(chain, statement); + String executeSql = statement.getLastExecuteSql(); + int result = 0; + if (rs != null) { + ResultSetImpl rss = rs.getResultSetRaw().unwrap(ResultSetImpl.class); + result = rss.getRows().size(); + } + try { + int size = statement.getParametersSize(); + if (size > 0) { + Collection values = statement.getParameters().values(); + List params = new ArrayList<>(); + for (JdbcParameter value : values) { + params.add(value.getValue()); + } + executeSql = SQLUtils.format(executeSql, JdbcUtils.MYSQL, params); + } + } catch (Exception ex) { + log.warn("[-SQL解析异常-][{}]", ex.getMessage()); + } + log.info("[----SQL----][select][执行结果:{}][ SQL: {} ]", result, executeSql); + return rs; + } + + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java index c854f10..7a0c432 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -18,6 +19,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @EnableTransactionManagement @Configuration +@Slf4j public class MybatisPlusConfig { /** diff --git a/nladmin-system/nlsso-server/src/main/resources/META-INF/druid-filter.properties b/nladmin-system/nlsso-server/src/main/resources/META-INF/druid-filter.properties new file mode 100644 index 0000000..9b025c1 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/resources/META-INF/druid-filter.properties @@ -0,0 +1 @@ +druid.filters.DruidFilter=org.nl.config.DruidFilter diff --git a/nladmin-system/nlsso-server/src/main/resources/config/application.yml b/nladmin-system/nlsso-server/src/main/resources/config/application.yml index 40f1d7e..5f90068 100644 --- a/nladmin-system/nlsso-server/src/main/resources/config/application.yml +++ b/nladmin-system/nlsso-server/src/main/resources/config/application.yml @@ -33,7 +33,7 @@ spring: max-pool-prepared-statement-per-connection-size: 20 #当值大于20时poolPreparedStatements会自动修改为true #通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - use-global-data-source-stat: true #合并多个DruidDataSource的监控数据 +# use-global-data-source-stat: true #合并多个DruidDataSource的监控数据 #filters通过别名的方式配置扩展插件,常用的插件有: #监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall filter: @@ -53,7 +53,7 @@ spring: login-username: admin login-password: admin dynamic: - primary: dm + primary: mysql datasource: mysql: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy @@ -79,6 +79,25 @@ spring: username: ${nl.config.dm.username} password: ${nl.config.dm.password} type: com.alibaba.druid.pool.DruidDataSource + druid: + filters: + DruidFilter,stat + initial-size: 5 #初始化时建立物理连接的个数 + min-idle: 15 #最小连接池数量 + maxActive: 30 #最大连接池数量 + maxWait: 3000 #获取连接时最大等待时间,单位毫秒 + #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + test-while-idle: true + time-between-eviction-runs-millis: 300000 #既作为检测的间隔时间又作为test-while-idle执行的依据 + min-evictable-idle-time-millis: 900000 #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接 + #用来检测连接是否有效的sql + #mysql中为 select 'x' + #oracle中为 select 1 from dual + validation-query: SELECT 'x' + test-on-borrow: true #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-return: false #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + pool-prepared-statements: true #是否缓存preparedStatement,mysql5.5+建议开启 + max-pool-prepared-statement-per-connection-size: 20 #当值大于20时poolPreparedStatements会自动修改为true flyway: #开启 enabled: false @@ -235,7 +254,7 @@ mybatis-plus: map-underscore-to-camel-case: false call-setters-on-nulls: true jdbc-type-for-null: null - # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl mapper-locations: - classpath:/org/nl/**/mapper/**/*.xml global-config: