我正在使用PostgreSQL 8.3,并在C中编写一个使用libpq API的程序.我使用PQsendQuery()函数异步执行命令.我正在尝试实现超时处理功能.我通过在超时到期时调用PQcancel()来实现它.我用一个返回10万行(持续约0.5秒)的查询测试了它,超时为1毫秒,发现PQcancel()阻塞而不是取消命令,直到服务器完成执行,然后返回成功的查询.
据我所知,文档说即使成功取消请求,查询仍可能被执行.我的问题是PQcancel()阻塞了我的执行线程,这是不可接受的,因为我使用异步处理(使用Boost Asio框架)所以我的程序,除了执行SQL查询之外可能还有其他任务,只运行一个线程.
PQcancel()阻塞是正常的吗?有没有办法进行非阻塞取消请求?
我看了PQcancel的实现.它创建了一个到服务器的单独TCP连接,这就是它阻塞的原因.这个代码部分在最新版本的PostgreSQL中也完全相同.所以我得出结论,除了在单独的线程中启动取消之外,没有办法使其成为非阻塞.这也是使用此功能的首选方式,因为取消对象完全独立于连接对象,因此它完全可以使用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。