1
mirror of https://github.com/CarmJos/EasySQL.git synced 2024-09-19 21:35:47 +00:00

fix(debug): 修复debug消息中耗时计算异常的问题

This commit is contained in:
Carm Jos 2022-06-06 18:18:26 +08:00
parent f16b5f22e1
commit 9b4460f97a
22 changed files with 118 additions and 50 deletions

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<version>0.3.17</version> <version>0.3.18</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -12,6 +12,7 @@ import java.sql.SQLException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
/** /**
* SQLAction 是用于承载SQL语句并进行处理返回的基本类 * SQLAction 是用于承载SQL语句并进行处理返回的基本类
@ -49,11 +50,23 @@ public interface SQLAction<T> {
@NotNull String getShortID(); @NotNull String getShortID();
/** /**
* 得到该Action的创建时间 * 得到该Action的创建时间
* <br>注意此处获得的时间非时间戳毫秒数仅用于计算耗时
* *
* @return 创建时间 (毫秒)
*/
default long getCreateTime() {
return getCreateTime(TimeUnit.MILLISECONDS);
}
/**
* 得到该Action的创建时间
* <br>注意此处获得的时间非时间戳毫秒数仅用于计算耗时
*
* @param unit 时间单位
* @return 创建时间 * @return 创建时间
*/ */
long getCreateTime(); long getCreateTime(TimeUnit unit);
/** /**
* 得到该Action所要执行的源SQL语句 * 得到该Action所要执行的源SQL语句

View File

@ -6,6 +6,7 @@ import cc.carm.lib.easysql.api.action.query.QueryAction;
import java.sql.Connection; import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Statement; import java.sql.Statement;
import java.util.concurrent.TimeUnit;
/** /**
* SQLQuery 是一个查询中间接口用于查询操作的封装 * SQLQuery 是一个查询中间接口用于查询操作的封装
@ -16,10 +17,22 @@ public interface SQLQuery extends AutoCloseable {
/** /**
* 获取该查询创建的时间 * 获取该查询创建的时间
* <br>注意此处获得的时间非时间戳毫秒数仅用于计算耗时
* *
* @return 创建时间 * @return 创建时间
*/ */
long getExecuteTime(); default long getExecuteTime() {
return getExecuteTime(TimeUnit.MILLISECONDS);
}
/**
* 获取该查询创建的时间
* <br>注意此处获得的时间非时间戳毫秒数仅用于计算耗时
*
* @param timeUnit 时间单位
* @return 创建时间
*/
long getExecuteTime(TimeUnit timeUnit);
/** /**
* 得到承载该SQLQuery的对应{@link SQLManager} * 得到承载该SQLQuery的对应{@link SQLManager}

View File

@ -10,6 +10,7 @@ import org.slf4j.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
/** /**
* 异常处理器 * 异常处理器
@ -30,11 +31,11 @@ public interface SQLDebugHandler {
/** /**
* 该方法将在 {@link SQLQuery#close()} 执行后调用 * 该方法将在 {@link SQLQuery#close()} 执行后调用
* *
* @param query {@link SQLQuery} 对象 * @param query {@link SQLQuery} 对象
* @param executeTime 该次查询开始执行的时间 * @param executeNanoTime 该次查询开始执行的时间 (单位纳秒)
* @param closeTime 该次查询彻底关闭的时间 * @param closeNanoTime 该次查询彻底关闭的时间 (单位纳秒)
*/ */
void afterQuery(@NotNull SQLQuery query, long executeTime, long closeTime); void afterQuery(@NotNull SQLQuery query, long executeNanoTime, long closeNanoTime);
default String parseParams(@Nullable Object[] params) { default String parseParams(@Nullable Object[] params) {
if (params == null) return "<#NULL>"; if (params == null) return "<#NULL>";
@ -51,40 +52,46 @@ public interface SQLDebugHandler {
@SuppressWarnings("DuplicatedCode") @SuppressWarnings("DuplicatedCode")
static SQLDebugHandler defaultHandler(Logger logger) { static SQLDebugHandler defaultHandler(Logger logger) {
return new SQLDebugHandler() { return new SQLDebugHandler() {
@Override @Override
public void beforeExecute(@NotNull SQLAction<?> action, @NotNull List<@Nullable Object[]> params) { public void beforeExecute(@NotNull SQLAction<?> action, @NotNull List<@Nullable Object[]> params) {
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
logger.info("┣# ActionUUID: {}", action.getActionUUID()); logger.info("┣# ActionUUID: {}", action.getActionUUID());
logger.info("┣# ActionType: {}", action.getClass().getName()); logger.info("┣# ActionType: {}", action.getClass().getSimpleName());
if (action.getSQLContents().size() == 1) { if (action.getSQLContents().size() == 1) {
logger.info("┣# SQLContent: {}", action.getSQLContents().get(0)); logger.info("┣# SQLContent: {}", action.getSQLContents().get(0));
} else { } else {
logger.info("┣# SQLContents: "); logger.info("┣# SQLContents: ");
int i = 0; int i = 0;
for (String sqlContent : action.getSQLContents()) { for (String sqlContent : action.getSQLContents()) {
logger.info("[{}] {}", ++i, sqlContent); logger.info("- [{}] {}", ++i, sqlContent);
} }
} }
if (params.size() == 1) { if (params.size() == 1) {
Object[] param = params.get(0); Object[] param = params.get(0);
logger.info("┣# SQLParams: {}", parseParams(param)); if (param != null) {
logger.info("┣# SQLParam: {}", parseParams(param));
}
} else if (params.size() > 1) { } else if (params.size() > 1) {
logger.info("┣# SQLParams: "); logger.info("┣# SQLParams: ");
int i = 0; int i = 0;
for (Object[] param : params) { for (Object[] param : params) {
logger.info("[{}] {}", ++i, parseParams(param)); logger.info("- [{}] {}", ++i, parseParams(param));
} }
} }
logger.info("┣# createTime: {}", action.getCreateTime()); logger.info("┣# CreateTime: {}", action.getCreateTime(TimeUnit.MILLISECONDS));
logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
} }
@Override @Override
public void afterQuery(@NotNull SQLQuery query, long executeTime, long closeTime) { public void afterQuery(@NotNull SQLQuery query, long executeNanoTime, long closeNanoTime) {
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
logger.info("┣# ActionUUID: {}", query.getAction().getActionUUID()); logger.info("┣# ActionUUID: {}", query.getAction().getActionUUID());
logger.info("┣# SQLContent: {}", query.getSQLContent()); logger.info("┣# SQLContent: {}", query.getSQLContent());
logger.info("┣# executeCost: {} ms", (closeTime - executeTime)); logger.info("┣# CloseTime: {} (cost {} ms)",
TimeUnit.NANOSECONDS.toMillis(closeNanoTime),
((double) (closeNanoTime - executeNanoTime) / 1000000)
);
logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
} }
}; };

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>0.3.17</version> <version>0.3.18</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -34,7 +34,7 @@ public class EasySQLTest {
tests.add(new SQLUpdateBatchTests()); tests.add(new SQLUpdateBatchTests());
tests.add(new SQLUpdateReturnKeysTest()); tests.add(new SQLUpdateReturnKeysTest());
tests.add(new QueryFunctionTest()); tests.add(new QueryFunctionTest());
tests.add(new DeleteTest()); // tests.add(new DeleteTest());
print("准备进行测试..."); print("准备进行测试...");

View File

@ -1,8 +1,8 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.SQLQuery; import cc.carm.lib.easysql.api.SQLQuery;
import cc.carm.lib.easysql.TestHandler;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -29,6 +29,12 @@ public class QueryCloseTest extends TestHandler {
); );
} }
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} }
} }

View File

@ -16,6 +16,11 @@ public class QueryFunctionTest extends TestHandler {
.orderBy("id", false) .orderBy("id", false)
.setLimit(1) .setLimit(1)
.build().executeFunction(query -> { .build().executeFunction(query -> {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (!query.getResultSet().next()) return -1; if (!query.getResultSet().next()) return -1;
else return query.getResultSet().getInt("id"); else return query.getResultSet().getInt("id");
}); });

View File

@ -1,8 +1,8 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.SQLQuery; import cc.carm.lib.easysql.api.SQLQuery;
import cc.carm.lib.easysql.TestHandler;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;

View File

@ -1,7 +1,7 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.TestHandler; import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays; import java.util.Arrays;

View File

@ -1,8 +1,8 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.enums.NumberType; import cc.carm.lib.easysql.api.enums.NumberType;
import cc.carm.lib.easysql.TestHandler;
import java.sql.SQLException; import java.sql.SQLException;

View File

@ -1,9 +1,9 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.enums.ForeignKeyRule; import cc.carm.lib.easysql.api.enums.ForeignKeyRule;
import cc.carm.lib.easysql.api.enums.IndexType; import cc.carm.lib.easysql.api.enums.IndexType;
import cc.carm.lib.easysql.TestHandler;
import java.sql.SQLException; import java.sql.SQLException;

View File

@ -1,7 +1,7 @@
package cc.carm.lib.easysql.tests; package cc.carm.lib.easysql.tests;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.TestHandler; import cc.carm.lib.easysql.TestHandler;
import cc.carm.lib.easysql.api.SQLManager;
import java.sql.SQLException; import java.sql.SQLException;

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="cc.carm.lib.easysql.EasySQLTest">
<Appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n"/>
</console>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg{nolookups}%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<OnStartupTriggeringPolicy/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL"/>
<RegexFilter regex=".*\$\{[^}]*\}.*" onMatch="DENY" onMismatch="NEUTRAL"/>
</filters>
<AppenderRef ref="File"/>
<appender-ref ref="Console"/>
</Root>
</Loggers>
</Configuration>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>0.3.17</version> <version>0.3.18</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -10,35 +10,36 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
public abstract class AbstractSQLAction<T> implements SQLAction<T> { public abstract class AbstractSQLAction<T> implements SQLAction<T> {
protected final @NotNull String sqlContent; protected final @NotNull String sqlContent;
private final @NotNull SQLManagerImpl sqlManager; private final @NotNull SQLManagerImpl sqlManager;
private final @NotNull UUID uuid; private final @NotNull UUID uuid;
private final long createTime; private final long createNanoTime;
public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql) { public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql) {
this(manager, sql, System.currentTimeMillis()); this(manager, sql, System.nanoTime());
} }
public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql, @NotNull UUID uuid) { public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql, @NotNull UUID uuid) {
this(manager, sql, uuid, System.currentTimeMillis()); this(manager, sql, uuid, System.nanoTime());
} }
public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql, long createTime) { public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql, long createNanoTime) {
this(manager, sql, UUID.randomUUID(), createTime); this(manager, sql, UUID.randomUUID(), createNanoTime);
} }
public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql, public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql,
@NotNull UUID uuid, long createTime) { @NotNull UUID uuid, long createNanoTime) {
Objects.requireNonNull(manager); Objects.requireNonNull(manager);
Objects.requireNonNull(sql); Objects.requireNonNull(sql);
Objects.requireNonNull(uuid); Objects.requireNonNull(uuid);
this.sqlManager = manager; this.sqlManager = manager;
this.sqlContent = sql; this.sqlContent = sql;
this.uuid = uuid; this.uuid = uuid;
this.createTime = createTime; this.createNanoTime = createNanoTime;
} }
@ -53,8 +54,8 @@ public abstract class AbstractSQLAction<T> implements SQLAction<T> {
} }
@Override @Override
public long getCreateTime() { public long getCreateTime(TimeUnit unit) {
return this.createTime; return unit.convert(createNanoTime, TimeUnit.NANOSECONDS);
} }
@Override @Override

View File

@ -67,12 +67,10 @@ public class PreparedQueryActionImpl extends QueryActionImpl implements Prepared
} }
try { try {
long executeTime = System.currentTimeMillis();
SQLQueryImpl query = new SQLQueryImpl( SQLQueryImpl query = new SQLQueryImpl(
getManager(), this, getManager(), this,
connection, preparedStatement, connection, preparedStatement,
preparedStatement.executeQuery(), preparedStatement.executeQuery()
executeTime
); );
getManager().getActiveQuery().put(getActionUUID(), query); getManager().getActiveQuery().put(getActionUUID(), query);
return query; return query;

View File

@ -35,12 +35,10 @@ public class QueryActionImpl extends AbstractSQLAction<SQLQuery> implements Quer
} }
try { try {
long executeTime = System.currentTimeMillis();
SQLQueryImpl query = new SQLQueryImpl( SQLQueryImpl query = new SQLQueryImpl(
getManager(), this, getManager(), this,
connection, statement, connection, statement,
statement.executeQuery(getSQLContent()), statement.executeQuery(getSQLContent())
executeTime
); );
getManager().getActiveQuery().put(getActionUUID(), query); getManager().getActiveQuery().put(getActionUUID(), query);

View File

@ -8,22 +8,23 @@ import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.concurrent.TimeUnit;
public class SQLQueryImpl implements SQLQuery { public class SQLQueryImpl implements SQLQuery {
protected final long executeTime; protected final long executeTime;
protected final SQLManagerImpl sqlManager; protected final SQLManagerImpl sqlManager;
final Connection connection; protected final Connection connection;
final Statement statement; protected final Statement statement;
final ResultSet resultSet; protected final ResultSet resultSet;
protected QueryActionImpl queryAction; protected QueryActionImpl queryAction;
public SQLQueryImpl( public SQLQueryImpl(
SQLManagerImpl sqlManager, QueryActionImpl queryAction, SQLManagerImpl sqlManager, QueryActionImpl queryAction,
Connection connection, Statement statement, ResultSet resultSet Connection connection, Statement statement, ResultSet resultSet
) { ) {
this(sqlManager, queryAction, connection, statement, resultSet, System.currentTimeMillis()); this(sqlManager, queryAction, connection, statement, resultSet, System.nanoTime());
} }
public SQLQueryImpl( public SQLQueryImpl(
@ -40,8 +41,8 @@ public class SQLQueryImpl implements SQLQuery {
} }
@Override @Override
public long getExecuteTime() { public long getExecuteTime(TimeUnit timeUnit) {
return this.executeTime; return timeUnit.convert(this.executeTime, TimeUnit.NANOSECONDS);
} }
@Override @Override
@ -73,7 +74,7 @@ public class SQLQueryImpl implements SQLQuery {
if (getManager().isDebugMode()) { if (getManager().isDebugMode()) {
try { try {
getManager().getDebugHandler().afterQuery(this, getExecuteTime(), System.currentTimeMillis()); getManager().getDebugHandler().afterQuery(this, getExecuteTime(TimeUnit.NANOSECONDS), System.nanoTime());
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@ -19,7 +19,7 @@
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>0.3.17</version> <version>0.3.18</version>
<modules> <modules>
<module>api</module> <module>api</module>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>0.3.17</version> <version>0.3.18</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easysql-parent</artifactId> <artifactId>easysql-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>0.3.17</version> <version>0.3.18</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>