Closed cbqqkcel closed 9 months ago
看了详情错误是超时导致的,但是异常信息没用体现出来
我配置的是session_timeout不超时,是不是配错了
用法是嵌入式的。
在 jdbc url 中加参数 NETWORK_TIMEOUT
为啥异常信息显示的是null指针,而不是 timeout异常呢。
调用 executeQuery,如果响应时间超时了会抛出 org.lealone.common.exceptions.JdbcSQLException: Network timeout: "ack timeout, request start time: 2023-06-24 14:15:25.364, network timeout: 1000ms, request packet: StatementQuery[SELECT pk, f1, f2, f3 from SelectTest]" [90147-0] at org.lealone.common.exceptions.DbException.getJdbcSQLException(DbException.java:342) at org.lealone.common.exceptions.DbException.get(DbException.java:173) at org.lealone.common.exceptions.DbException.get(DbException.java:150) at org.lealone.db.async.AsyncCallback.handleTimeout(AsyncCallback.java:221) at org.lealone.db.async.AsyncCallback.checkTimeout(AsyncCallback.java:214) at org.lealone.net.TcpClientConnection.checkTimeout(TcpClientConnection.java:132) at org.lealone.net.AsyncConnectionPool.checkTimeout(AsyncConnectionPool.java:64) at org.lealone.net.NetClientBase.checkTimeout(NetClientBase.java:129) at org.lealone.net.nio.NioEventLoopClient.run(NioEventLoopClient.java:60) at org.lealone.net.nio.NioEventLoopClient.lambda$0(NioEventLoopClient.java:44) at java.lang.Thread.run(Thread.java:748)
如果调用的是 executeQueryAsync,要像这样使用:
((JdbcStatement) stmt).executeQueryAsync(sql).onSuccess(result -> {
}).onFailure(t -> {
t.printStackTrace();
});
你的场景需要打断点跟踪一下完整的异常链,我看不出是哪里的代码出异常了。 最大的可能就是框架没有捕获超时异常,然后调用 getMetaData()。
调用 org.lealone.db.result.Result.getVisibleColumnCount() 的地方有很多,不一定是超时的原因, 你可以在 org.lealone.client.jdbc.JdbcResultSet.JdbcResultSet(JdbcConnection, JdbcStatement, Result, int, boolean, boolean, boolean) 里打个断点,或者在 org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible 那里打断点,看看完整的异常链是什么。
目前应该就是超时的问题,之前使用默认设置,在压力测试下。经常出现这个错误。后来调大时间后再也没有出现过了
一个页面的查询,有时候会出现这个错误。不好重现的问题。