为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000c
03134283950-20221121-175072-20024
【操作系统】:win10
【CPU】: intel x86_64
【问题描述】*:客户端在执行sql语句时,希望能设置超时时间,如果在指定时间内数据库没有返回,则返回超时报错,不再等待。
参考手册,使用以下代码设置超时时间,然后执行dbms_lock.sleep()测试:
/* 申请连接句柄 */
CHECK(dpi_alloc_con(henv, &hcon), DSQL_HANDLE_DBC, hcon);
CHECK(dpi_set_con_attr(hcon, DSQL_ATTR_CONNECTION_TIMEOUT, (dpointer)3, 0), DSQL_HANDLE_DBC, hcon); /* 设置3秒超时 */
/* 申请语句句柄 */
CHECK(dpi_alloc_stmt(hcon, &hstmt), DSQL_HANDLE_DBC, hcon);
CHECK(dpi_set_stmt_attr(hstmt, DSQL_ATTR_QUERY_TIMEOUT, (dpointer)3, 0), DSQL_HANDLE_STMT, hstmt); /* 设置3秒超时 */
CHECK(dpi_prepare(hstmt, "dbms_lock.sleep(5)"), DSQL_HANDLE_STMT, hstmt);
print_time();
CHECK(dpi_exec(hstmt), DSQL_HANDLE_STMT, hstmt);
print_time();
}
完整测试代码见test.zip。
预期执行3秒后超时中断,实际执行了5秒才返回,超时并没有生效。请问是设置超时参数方式不对,还是测试方法有问题?
您好,根据您提供的这个小demo验证了下,您使用的这个dbms_lock.sleep(5)的验证方式有问题,代码设置时间没有问题,您可以模拟一个阻塞来验证,比如在数据库创建一张表t4并插入1000条数据,先在一个disql里模拟update 不提交,然后再小demo里再模拟修改这条数据即可验证

