gpt4 book ai didi

c++ - PostgreSQL:取消来自 C/C++ 程序的查询

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:45 25 4
gpt4 key购买 nike

我正在使用 PostgreSQL 8.3,并使用 libpq API 用 C++ 编写程序。我使用 PQsendQuery() 函数异步执行命令。我正在尝试实现超时处理功能。我通过在超时到期时调用 PQcancel() 来实现它。我使用返回 100 000 行(持续约 0.5 秒)且超时为 1 毫秒的查询对其进行了测试,发现 PQcancel() 不会取消命令,而是阻塞直到服务器完成执行,然后返回一个成功的查询。

我知道文档说即使取消请求成功,查询仍可能会执行。我的问题是 PQcancel() 阻塞了我的执行线程,这是 Not Acceptable ,因为我使用异步处理(使用 Boost Asio 框架)所以我的程序除了执行之外可能还有其他任务要做SQL 查询,仅在一个线程上运行。

PQcancel() 阻塞是否正常?有什么方法可以发出非阻塞取消请求吗?

最佳答案

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

关于c++ - PostgreSQL:取消来自 C/C++ 程序的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18015203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com