pet*_*ohn 6 c c++ postgresql libpq
我正在使用PostgreSQL 8.3,并在使用libpqAPI的C++中编写程序.我与PQsendQuery()函数异步执行命令.我正在尝试实现超时处理功能.我PQcancel()在超时到期时通过调用实现它.我使用一个返回100 000行(持续约0.5秒)并且超时为1毫秒的查询进行测试,发现不是取消命令,而是PQcancel()阻塞直到服务器完成执行,然后返回成功的查询.
据我所知,文档说即使成功取消请求,查询仍可能被执行.我的问题是PQcancel()阻塞我的执行线程,这是不可接受的,因为我使用异步处理(使用Boost Asio框架)所以我的程序,除了执行SQL查询之外可能还有其他任务,只在一个线程上运行.
PQcancel()阻止是正常的吗?有没有办法进行非阻塞取消请求?
我查看了 的实现PQcancel。它创建一个到服务器的单独的 TCP 连接,这就是它被阻塞的原因。该代码部分在最新版本的 PostgreSQL 中也完全相同。所以我得出的结论是,除了在单独的线程中启动取消之外,没有其他方法可以使其成为非阻塞。这也是使用此功能的首选方式,因为取消对象完全独立于连接对象,因此使用时是完全线程安全的。