当前位置:网站首页>How to use filters in jfinal to monitor Druid for SQL execution?
How to use filters in jfinal to monitor Druid for SQL execution?
2022-06-30 22:04:00 【Game programming】
Abstract : What I want to do at first is to intercept through interceptors SQL perform , But it was tested and found that , The filter can listen to at least every SQL Execution and return results of . therefore , Record this exploration .
This article is shared from Huawei cloud community 《jfinal Filter monitoring in Druid Of SQL perform 【 May 07】》, author :KevinQ .
What I want to do at first is to intercept through interceptors SQL perform , For example, similar to PageHelper This plug-in , Through interceptors or filters , Manually modify SQL sentence , To meet certain business requirements , For example, perform paging , Or restrict access to data permissions . But I found the information that the filter is not for this , This is what the database middleware does , such as MyCat etc. .
But it was tested and found that , The filter can listen to at least every SQL Execution and return results of . therefore , Record this exploration .
Configure filters
stay jfinal In the startup configuration class of , There is a function configPlugin(Plugins me) Function to configure the plug-in , This function will be in jfinal Call at startup , The argument to this function is Plugins me, This parameter is a plug-in manager , You can add plug-ins through this plug-in manager .
Database plug-ins Druid Is added in this function .
public void configPlugin(Plugins me) { DruidPlugin druidPlugin = createDruidPlugin_holdoa(); druidPlugin.setPublicKey(p.get("publicKeydebug").trim()); wallFilter = new WallFilter(); wallFilter.setDbType("mysql"); druidPlugin_oa.addFilter(wallFilter); druidPlugin_oa.addFilter(new StatFilter()); me.add(druidPlugin);}We refer to WallFilter as well as StatFilter Also create a filter class :
import com.alibaba.druid.filter.FilterEventAdapter;public class DataScopeFilter extends FilterEventAdapter {}We found that FilterEventAdapter There are several methods in :
public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql) throws SQLException {...}protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) {...}protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) {...}protected void statementExecuteQueryBefore(StatementProxy statement, String sql) {...}protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) {...}protected void statementExecuteBefore(StatementProxy statement, String sql) {...}protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) {...}Let's repeat these methods to see ( exclude Update Method , Because we are more concerned with query statements )
package xxxx.xxxx;import com.alibaba.druid.filter.FilterChain;import com.alibaba.druid.filter.FilterEventAdapter;import com.alibaba.druid.proxy.jdbc.ResultSetProxy;import com.alibaba.druid.proxy.jdbc.StatementProxy;import com.jfinal.kit.LogKit;import java.sql.SQLException;public class DataScopeFilter extends FilterEventAdapter { @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql) throws SQLException { LogKit.info("statement_execute"); return super.statement_execute(chain, statement, sql); } @Override protected void statementExecuteQueryBefore(StatementProxy statement, String sql) { LogKit.info("statementExecuteQueryBefore"); super.statementExecuteQueryBefore(statement, sql); } @Override protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) { LogKit.info("statementExecuteQueryAfter"); super.statementExecuteQueryAfter(statement, sql, resultSet); } @Override protected void statementExecuteBefore(StatementProxy statement, String sql) { LogKit.info("statementExecuteBefore"); super.statementExecuteBefore(statement, sql); } @Override protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) { LogKit.info("statementExecuteAfter"); super.statementExecuteAfter(statement, sql, result); } @Override public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql) throws SQLException { LogKit.info("statement_executeQuery"); return super.statement_executeQuery(chain, statement, sql); }}And then again config Add a filter to the configuration class :
druidPlugin.addFilter(new DataScopeFilter());The execution sequence of the initiation is :
statement_executeQuerystatementExecuteQueryBeforestatementExecuteQueryAfterView parent code , It is found that the execution logic is , First, execute statement_executeQuery, And then because the method of the parent is called , The parent method body is :
@Override public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql) throws SQLException { statementExecuteQueryBefore(statement, sql); try { ResultSetProxy resultSet = super.statement_executeQuery(chain, statement, sql); if (resultSet != null) { statementExecuteQueryAfter(statement, sql, resultSet); resultSetOpenAfter(resultSet); } return resultSet; } catch (SQLException error) { statement_executeErrorAfter(statement, sql, error); throw error; } catch (RuntimeException error) { statement_executeErrorAfter(statement, sql, error); throw error; } catch (Error error) { statement_executeErrorAfter(statement, sql, error); throw error; } } This further triggers statementExecuteQueryBefore Methods and statementExecuteQueryAfter Method .
So we , modify statement_executeQuery Method :
@Override public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql) throws SQLException { statementExecuteQueryBefore(statement, sql); ResultSetProxy result = chain.statement_executeQuery(statement, sql); statementExecuteQueryAfter(statement, sql, result); return result; }such , Let the output result be :
statementExecuteQueryBeforestatement_executeQuerystatementExecuteQueryAfterWe can do it in Before perhaps After Method , such as : Record SQL The actual executor of , Operating time , Request execution SQL The interface of .
sql Be declared final type
Find out what's going on SQL stay Druid The corresponding class in is :DruidPooledPreparedStatement, Its class structure is :
public class DruidPooledPreparedStatement extends DruidPooledStatement implements PreparedStatement { private final static Log LOG = LogFactory.getLog(DruidPooledPreparedStatement.class); private final PreparedStatementHolder holder; private final PreparedStatement stmt; private final String sql; ....} This means , Once this class is created ,SQL After setting, it cannot be modified , therefore , We need to change SQL Words , It needs to be in prepared The object is modified to the corresponding execution before it is generated SQL.
In the course of debugging , It is found that the following method needs to be overwritten :
@Override public PreparedStatementProxy connection_prepareStatement(FilterChain chain, ConnectionProxy connection, String sql) throws SQLException { // It can be modified SQL Purpose sql += " LIMIT 1"; PreparedStatementProxy statement = super.connection_prepareStatement(chain, connection, sql); statementPrepareAfter(statement); return statement; } We can add custom here SQL Modify the logic , For example, add data permissions and so on .
Click to follow , The first time to learn about Huawei's new cloud technology ~
author : Huawei cloud developer Alliance
Game programming , A game development favorite ~
If the picture is not displayed for a long time , Please use Chrome Kernel browser .
边栏推荐
- Do machine learning jobs require graduate students?
- Excitatory neurotransmitter glutamate and brain health
- Is machine learning suitable for girls?
- Look at the top 10 capabilities of alicloud cipu
- Online education program user login and registration
- I want to know who I need to know to open a stock account? In addition, is it safe to open a mobile account?
- Is Wu Enda's machine learning suitable for entry?
- 顺祝老吴的聚会
- Flip the linked list ii[three ways to flip the linked list +dummyhead/ head insertion / tail insertion]
- 从PG15 XID64再次跳票说起
猜你喜欢

Zhoushaojian, rare

Qsort function and Simulation Implementation of qsort function
![[introduction to MySQL] the first conversation · first time in the](/img/73/cc85eb469384c3df94479318293c6f.png)
[introduction to MySQL] the first conversation · first time in the "database" Mainland

Neurotransmetteurs excitateurs - glutamate et santé cérébrale

Study summary of dynamic routing between capsules

Pytorch quantitative practice (2)

《Dynamic Routing Between Capsules》论文学习总结

1-2 安装并配置MySQL相关的软件

PyTorch量化实践(1)

JD and Tencent renewed the three-year strategic cooperation agreement; The starting salary rose to 260000 yuan, and Samsung sk of South Korea scrambled for a raise to retain semiconductor talents; Fir
随机推荐
1-2 install and configure MySQL related software
PostgreSQL存储结构浅析
On several key issues of digital transformation
Microservice link risk analysis
1-11 create online file service
5G 在智慧医疗中的需求
Error reporting: internal error XFS_ WANT_ CORRUPTED_ GOTO at line 1635 of file fs/xfs/libxfs/xfs_ alloc. c.
[untitled] first time to participate in CSDN activities
1-7 Path路径模块
Introduction to go web programming: a probe into the excellent test library gocovey
Docker installing MySQL
I want to know who I need to know to open a stock account? In addition, is it safe to open a mobile account?
Uniapp rich text editor
Qsort function and Simulation Implementation of qsort function
Domestic database disorder
MFC interface library bcgcontrolbar v33.0 - desktop alarm window, grid control upgrade, etc
Summary of errors reported when using YML file to migrate CONDA environment
The Jenkins download Plug-in can't be downloaded. Solution
1-14 express managed static resources
Is the stock account opened in qiniu safe? How to apply for a low commission stock account?