我正在使用PostgreSQL 8.3,并用C ++编写一个使用libpq
API的程序。我使用PQsendQuery()
函数异步执行命令。我正在尝试实现超时处理功能。我在超时到期时通过调用PQcancel()
来实现它。我用一个返回10万行(它持续约0.5秒)并且超时为1毫秒的查询测试了它,并发现PQcancel()
阻塞而不是取消命令,直到服务器完成执行,然后返回成功的查询。
据我所知,文档说即使成功取消请求,查询仍可能会被执行。我的问题是PQcancel()
阻塞了我的执行线程,这是不可接受的,因为我使用异步处理(使用Boost Asio框架)所以我的程序,除了执行SQL查询之外可能还有其他任务要做,只在一个帖子上。
PQcancel()
阻止是正常的吗?有没有办法进行非阻塞取消请求?
答案 0 :(得分:2)
我查看了PQcancel
的实现。它创建了一个到服务器的单独TCP连接,这就是它阻塞的原因。这个代码部分在最新版本的PostgreSQL中也是完全相同的。所以我得出结论,除了在单独的线程中启动取消之外,没有办法使其成为非阻塞。这也是使用此功能的首选方式,因为取消对象完全独立于连接对象,因此它完全可以使用线程安全。
答案 1 :(得分:0)
听起来你是在阻塞连接上这样做的。检查PQsetnonblocking的文档,将连接设置为非阻塞,您应该能够立即返回PQCancel。但它也会使连接上的所有操作都无阻塞。