Skip to content

Commit 8af9763

Browse files
committed
update version
1 parent 550201c commit 8af9763

23 files changed

+353
-284
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public class MySQLListener implements SQLExecuteListener {
116116
public void after(SQLExecuteState executeState, Object result) {
117117
System.out.println("执行后 - SQL: " + executeState.getSql());
118118
System.out.println("执行后 - 参数: " + executeState.getListParams());
119+
System.out.println("执行后 - 耗时: " + executeState.getExecuteTimestamp());
119120
System.out.println("执行后 - 结果: " + result);
120121
}
121122
}

src/main/java/com/codingapi/dbstream/interceptor/SQLExecuteState.java

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ public class SQLExecuteState {
6262
@Getter
6363
private Object result;
6464

65+
/**
66+
* 开始执行SQL时间戳
67+
*/
68+
@Getter
69+
private long beginTimestamp;
70+
71+
/**
72+
* 结束执行SQL时间戳
73+
*/
74+
@Getter
75+
private long afterTimestamp;
76+
77+
6578
public SQLExecuteState(String sql, ConnectionProxy connection, Statement statement, DBMetaData metaData) {
6679
this.sql = sql;
6780
this.connection = connection;
@@ -72,6 +85,30 @@ public SQLExecuteState(String sql, ConnectionProxy connection, Statement stateme
7285
this.mapParams = new HashMap<>();
7386
}
7487

88+
/**
89+
* 记录执行前时间
90+
*/
91+
void begin() {
92+
this.beginTimestamp = System.currentTimeMillis();
93+
}
94+
95+
/**
96+
* 记录执行后时间
97+
*/
98+
void after() {
99+
this.afterTimestamp = System.currentTimeMillis();
100+
}
101+
102+
103+
/**
104+
* SQL执行总耗时
105+
*
106+
* @return 执行耗时
107+
*/
108+
public long getExecuteTimestamp() {
109+
return this.afterTimestamp - this.beginTimestamp;
110+
}
111+
75112
/**
76113
* 更新sql参数
77114
*
@@ -106,22 +143,21 @@ public DbTable getTable(String tableName) {
106143
return metaData.getTable(tableName);
107144
}
108145

109-
110146
/**
111-
* 是否有metadata数据
147+
* 元数据中是否存在表
112148
*
149+
* @param tableName 表名称
113150
* @return true 存在
114151
*/
115-
public boolean hasMetaData() {
116-
return metaData != null && metaData.hasMetaData();
152+
public DbTable getDbTable(String tableName) {
153+
return this.metaData != null ? this.metaData.getTable(tableName) : null;
117154
}
118155

119-
120156
/**
121157
* 获取事务标识信息
122158
*/
123-
public String getTransactionKey(){
124-
if(this.connection!=null){
159+
public String getTransactionKey() {
160+
if (this.connection != null) {
125161
return this.connection.getTransactionKey();
126162
}
127163
return null;

src/main/java/com/codingapi/dbstream/interceptor/SQLRunningContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public void addListener(SQLExecuteListener listener) {
2727
@Override
2828
public void after(SQLExecuteState executeState, Object result) throws SQLException {
2929
executeState.setResult(result);
30+
executeState.after();
3031
for (SQLExecuteListener listener : listeners) {
3132
listener.after(executeState, result);
3233
}
@@ -35,6 +36,7 @@ public void after(SQLExecuteState executeState, Object result) throws SQLExcepti
3536

3637
@Override
3738
public void before(SQLExecuteState executeState) throws SQLException {
39+
executeState.begin();
3840
for (SQLExecuteListener listener : listeners) {
3941
listener.before(executeState);
4042
}
Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,38 @@
11
package com.codingapi.dbstream.listener;
22

33
import com.codingapi.dbstream.interceptor.SQLExecuteState;
4-
import com.codingapi.dbstream.parser.DeleteDataParser;
4+
import com.codingapi.dbstream.parser.DeleteDBEventParser;
5+
import com.codingapi.dbstream.scanner.DbTable;
56
import com.codingapi.dbstream.stream.DBEvent;
67
import com.codingapi.dbstream.stream.TransactionEventPools;
8+
import com.codingapi.dbstream.utils.SQLParamUtils;
79
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
10+
import net.sf.jsqlparser.schema.Table;
811
import net.sf.jsqlparser.statement.Statement;
912
import net.sf.jsqlparser.statement.delete.Delete;
1013

1114
import java.sql.SQLException;
1215
import java.util.List;
13-
import java.util.regex.Pattern;
1416

1517
public class SQLDeleteExecuteListener implements SQLExecuteListener {
1618

17-
private final static ThreadLocal<DeleteDataParser> threadLocal = new ThreadLocal<>();
18-
19-
private static final Pattern DELETE_SQL_PATTERN = Pattern.compile(
20-
"^\\s*(?i)(DELETE)\\b.*",
21-
Pattern.DOTALL
22-
);
23-
24-
25-
public static boolean match(String sql) {
26-
if (sql == null || sql.trim().isEmpty()) {
27-
return false;
28-
}
29-
return DELETE_SQL_PATTERN.matcher(sql.trim()).matches();
30-
}
31-
32-
@Override
33-
public void after(SQLExecuteState executeState, Object result) throws SQLException {
34-
String sql = executeState.getSql();
35-
String transactionKey = executeState.getTransactionKey();
36-
if (match(sql) && executeState.hasMetaData()) {
37-
DeleteDataParser dataParser = threadLocal.get();
38-
if (dataParser != null) {
39-
List<DBEvent> eventList = dataParser.loadEvents(result);
40-
TransactionEventPools.getInstance().addEvents(transactionKey,eventList);
41-
threadLocal.remove();
42-
}
43-
}
44-
}
19+
private final static ThreadLocal<DeleteDBEventParser> threadLocal = new ThreadLocal<>();
4520

4621
@Override
4722
public void before(SQLExecuteState executeState) throws SQLException {
4823
String sql = executeState.getSql();
49-
if (match(sql) && executeState.hasMetaData()) {
24+
if (SQLParamUtils.isDeleteSQL(sql)) {
5025
try {
5126
threadLocal.remove();
5227
Statement parserStatement = CCJSqlParserUtil.parse(sql);
5328
Delete delete = (Delete) parserStatement;
54-
DeleteDataParser dataParser = new DeleteDataParser(executeState, delete);
55-
dataParser.prepare();
56-
threadLocal.set(dataParser);
29+
Table table = delete.getTable();
30+
DbTable dbTable = executeState.getDbTable(table.getName());
31+
if (dbTable != null) {
32+
DeleteDBEventParser dataParser = new DeleteDBEventParser(executeState, delete, table, dbTable);
33+
dataParser.prepare();
34+
threadLocal.set(dataParser);
35+
}
5736
} catch (Exception e) {
5837
threadLocal.remove();
5938
throw new SQLException(e);
@@ -62,4 +41,18 @@ public void before(SQLExecuteState executeState) throws SQLException {
6241
threadLocal.remove();
6342
}
6443
}
44+
45+
@Override
46+
public void after(SQLExecuteState executeState, Object result) throws SQLException {
47+
String sql = executeState.getSql();
48+
String transactionKey = executeState.getTransactionKey();
49+
if (SQLParamUtils.isDeleteSQL(sql)) {
50+
DeleteDBEventParser dataParser = threadLocal.get();
51+
if (dataParser != null) {
52+
List<DBEvent> eventList = dataParser.loadEvents(result);
53+
TransactionEventPools.getInstance().addEvents(transactionKey, eventList);
54+
threadLocal.remove();
55+
}
56+
}
57+
}
6558
}

src/main/java/com/codingapi/dbstream/listener/SQLExecuteListener.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,20 @@
66

77
public interface SQLExecuteListener {
88

9+
/**
10+
* before sql execute
11+
*
12+
* @param executeState execute state content
13+
* @throws SQLException throws {@link SQLException}
14+
*/
15+
void before(SQLExecuteState executeState) throws SQLException;
16+
17+
/**
18+
* after sql execute
19+
*
20+
* @param executeState execute state content
21+
* @throws SQLException throws {@link SQLException}
22+
*/
923
void after(SQLExecuteState executeState, Object result) throws SQLException;
1024

11-
void before(SQLExecuteState executeState) throws SQLException;
1225
}
Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,57 @@
11
package com.codingapi.dbstream.listener;
22

33
import com.codingapi.dbstream.interceptor.SQLExecuteState;
4-
import com.codingapi.dbstream.parser.InsertDataParser;
4+
import com.codingapi.dbstream.parser.InsertDBEventParser;
5+
import com.codingapi.dbstream.scanner.DbTable;
56
import com.codingapi.dbstream.stream.DBEvent;
67
import com.codingapi.dbstream.stream.TransactionEventPools;
8+
import com.codingapi.dbstream.utils.SQLParamUtils;
79
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
10+
import net.sf.jsqlparser.schema.Table;
811
import net.sf.jsqlparser.statement.Statement;
912
import net.sf.jsqlparser.statement.insert.Insert;
1013

1114
import java.sql.SQLException;
1215
import java.util.List;
13-
import java.util.regex.Pattern;
1416

1517
public class SQLInsertExecuteListener implements SQLExecuteListener {
1618

17-
private final static ThreadLocal<InsertDataParser> threadLocal = new ThreadLocal<>();
19+
private final static ThreadLocal<InsertDBEventParser> threadLocal = new ThreadLocal<>();
1820

19-
20-
private static final Pattern INSERT_SQL_PATTERN = Pattern.compile(
21-
"^\\s*(?i)(INSERT)\\b.*",
22-
Pattern.DOTALL
23-
);
24-
25-
public static boolean match(String sql) {
26-
if (sql == null || sql.trim().isEmpty()) {
27-
return false;
21+
@Override
22+
public void before(SQLExecuteState executeState) throws SQLException {
23+
String sql = executeState.getSql();
24+
if (SQLParamUtils.isInsertSQL(sql)) {
25+
try {
26+
threadLocal.remove();
27+
Statement parserStatement = CCJSqlParserUtil.parse(sql);
28+
Insert insert = (Insert) parserStatement;
29+
Table table = insert.getTable();
30+
DbTable dbTable = executeState.getDbTable(table.getName());
31+
if (dbTable != null) {
32+
InsertDBEventParser dataParser = new InsertDBEventParser(executeState, insert, table, dbTable);
33+
dataParser.prepare();
34+
threadLocal.set(dataParser);
35+
}
36+
} catch (Exception e) {
37+
threadLocal.remove();
38+
throw new SQLException(e);
39+
}
2840
}
29-
return INSERT_SQL_PATTERN.matcher(sql.trim()).matches();
3041
}
3142

3243
@Override
3344
public void after(SQLExecuteState executeState, Object result) throws SQLException {
3445
String sql = executeState.getSql();
3546
String transactionKey = executeState.getTransactionKey();
36-
if (match(sql) && executeState.hasMetaData()) {
37-
InsertDataParser dataParser = threadLocal.get();
47+
if (SQLParamUtils.isInsertSQL(sql)) {
48+
InsertDBEventParser dataParser = threadLocal.get();
3849
if (dataParser != null) {
3950
List<DBEvent> eventList = dataParser.loadEvents(result);
40-
TransactionEventPools.getInstance().addEvents(transactionKey,eventList);
51+
TransactionEventPools.getInstance().addEvents(transactionKey, eventList);
4152
threadLocal.remove();
4253
}
4354
}
4455
}
4556

46-
@Override
47-
public void before(SQLExecuteState executeState) throws SQLException {
48-
String sql = executeState.getSql();
49-
if (match(sql) && executeState.hasMetaData()) {
50-
try {
51-
threadLocal.remove();
52-
Statement parserStatement = CCJSqlParserUtil.parse(sql);
53-
Insert insert = (Insert) parserStatement;
54-
InsertDataParser dataParser = new InsertDataParser(executeState, insert);
55-
dataParser.prepare();
56-
threadLocal.set(dataParser);
57-
} catch (Exception e) {
58-
threadLocal.remove();
59-
throw new SQLException(e);
60-
}
61-
}
62-
}
6357
}

0 commit comments

Comments
 (0)