加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:从C/C++程序取消查询

发布时间:2020-12-13 18:10:23 所属栏目:百科 来源:网络整理
导读:我正在使用PostgreSQL 8.3,并在C中编写一个使用libpq API的程序.我使用PQsendQuery()函数异步执行命令.我正在尝试实现超时处理功能.我通过在超时到期时调用PQcancel()来实现它.我用一个返回10万行(持续约0.5秒)的查询测试了它,超时为1毫秒,发现PQcancel()阻
我正在使用PostgreSQL 8.3,并在C中编写一个使用libpq API的程序.我使用PQsendQuery()函数异步执行命令.我正在尝试实现超时处理功能.我通过在超时到期时调用PQcancel()来实现它.我用一个返回10万行(持续约0.5秒)的查询测试了它,超时为1毫秒,发现PQcancel()阻塞而不是取消命令,直到服务器完成执行,然后返回成功的查询.

据我所知,文档说即使成功取消请求,查询仍可能被执行.我的问题是PQcancel()阻塞了我的执行线程,这是不可接受的,因为我使用异步处理(使用Boost Asio框架)所以我的程序,除了执行SQL查询之外可能还有其他任务,只运行一个线程.

PQcancel()阻塞是正常的吗?有没有办法进行非阻塞取消请求?

我看了PQcancel的实现.它创建了一个到服务器的单独TCP连接,这就是它阻塞的原因.这个代码部分在最新版本的PostgreSQL中也完全相同.所以我得出结论,除了在单独的线程中启动取消之外,没有办法使其成为非阻塞.这也是使用此功能的首选方式,因为取消对象完全独立于连接对象,因此它完全可以使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读