Timeout超时问题

【 使用环境 】生产环境
【 OB or 其他组件 】OceanBase_CE
【 使用版本 】5.7.25-OceanBase_CE-v4.3.4.1
【问题描述】查询超时问题,全局配置了2分钟超时,从日志跟踪发现一个SQL超时了,后续增加了日志打印把SQL打印出来,复制到navicat直接跑,十秒钟到二十秒不等就查询完成了,有点不明所以,服务上面只要一点页面100%超时,复制出来又不会
【复现路径】页面操作触发业务查询,SQL我就不贴出来了, 大体是一条报表的SQL,在此基础上套了一层count如下
select count(*) xxx
【附件及日志】
java.sql.SQLTransientConnectionException: (conn=3221945746) Timeout, query has reached the maximum query timeout: 120000000(us), maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again.

10 个赞

ob_query_timeout 查一下参数设置 是否重新连过 设置全局需要重新连接

5 个赞

学习一下

2 个赞

maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again. 调整一下这2个参数ob_query_timeout or query_timeout hint。

3 个赞


这个参数很早之前就设置过的,一直都是这个值

1 个赞

我知道可以调整Hint,但是我疑问点事为什么直接复制出来跑没超时,但是在程序就超时了,有点看不懂

2 个赞

程序去实现跟直接执行SQL语句压根不一样的呀

1 个赞

怎么不一样的,程序是java调用jdbc去执行的一条SQL查询报表,应该没有什么额外花销吧,而且这个是数据库底层的报错超时

3 个赞

感谢解答OceanBase问题!对于query场景,我的经验是重点关注timeout配置。

1 个赞

可以看看你们jdbc的有些参数怎么设置的 可以发一下链接串
java端是否设置了更短的时间
statement.setQueryTimeout(0);
socketTimeout 是否设置的合理

2 个赞

支持一下

1 个赞

无效回复,刷积分,会给禁言
看看社区治理公告

2 个赞

jdbc的参数如下,然后使用了默认的druid连接池,连接池用默认参数,会不会跟我用ob的驱动有关系
url: “jdbc:oceanbase://xxx?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&rewriteBatchedStatements=true”
driver-class-name: “com.oceanbase.jdbc.Driver”

1 个赞

ob驱动是哪个版本的

<oceanbase.version>2.4.16</oceanbase.version>

        <dependency>
            <groupId>com.oceanbase</groupId>
            <artifactId>oceanbase-client</artifactId>
            <version>${oceanbase.version}</version>
        </dependency>

能看一下 你的语句在java端怎么添加的hint么? 从报错的信息 来看确实数据库服务端超时了
数据库查一下这个语句request_time的时间
SELECT request_time,
elapsed_time / 1000000 AS elapsed_sec,
ret_code,
sql_text,
query_sql
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE sql_text LIKE ‘%你的表名%’
AND ret_code = -4012
ORDER BY request_time DESC
LIMIT 5;

1 个赞



上面一个with的临时表,这里是最终的查询,以前是没有的,后面发现超时才加上,其实就是想想搞懂为什么会超时而已,复制出来跑没问题,然后日志也打印SQL也复制出来没问题

1 个赞

数据库查一下这个语句request_time的时间
SELECT request_time,
elapsed_time / 1000000 AS elapsed_sec,
ret_code,
sql_text,
query_sql
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE sql_text LIKE ‘%你的表名%’
AND ret_code = -4012
ORDER BY request_time DESC
LIMIT 5; 这个信息 也查一下

2 个赞

你这个语句 hint是作用子查询上了吧 你把这个hint挪到最外层 或者 在连接层统一调大 session 超时
spring:
datasource:
druid:
connection-init-sqls: SET ob_query_timeout = 300000000

根据我发的语句 查一下完整过的语句 看看

2 个赞


我的这个版本没有sql_text字段,所以我改成用了QUERY_SQL去模糊查询了

1 个赞