检测并处理数据库查询出错的时间

时间:2014-09-14 08:12:13

标签: sql qt postgresql

我的问题是我希望我的所有查询都必须在有限的时间后返回结果。 AFAIK,postgres有2个选项:connect_timeout打开与数据库的连接,statement_timeout表示查询。

这导致了2个问题:

  1. 我必须估计查询运行的时间。我的方法是设置 最糟糕的情况:使用预设带宽到数据库服务器,查询 有很多记录...来确定它,但我认为这不是一个聪明的 办法。是否有更好的想法/模式......来处理这个问题?

  2. 网络问题。假设网络很重,数据包很重     丢失,高ping作为地狱...来自客户端的查询,以及来自的结果     服务器卡住...当然我们可以设置一个     从代码中超时,但我认为它会因为复杂而变得复杂     处理资源和其他东西,并与它重复     数据库超时机制。无论如何都要处理这个问题吗?

  3. 故事的另一个版本:当一个查询花了很长时间,我想区分:这个查询都很好,只是有太多记录,等待它,不,查询是“破碎”,不是等等......

    Ps:我找到了这个链接,但这是针对SQL Server 2005的:(

    http://www.mssqltips.com/sqlservertip/1338/finding-a-sql-server-process-percentage-complete-with-dmvs/

3 个答案:

答案 0 :(得分:3)

正如您已经提到的,很难预测查询运行多长时间(由于服务器负载,由于网络,查询本身及其参数)。

无论如何,您应该将SQL查询移动到QThreads中。这允许您的应用程序在查询运行时提供GUI。

此外,我不会试图通过超时来解决这个问题。您将遇到很多麻烦,因为您将无法为每个查询和每种情况选择正确的超时。而是提供一种通过按钮或对话框取消查询的方法,以便用户可以决定继续等待是否合理。

答案 1 :(得分:3)

你想做什么:

  

当一个查询需要很长时间时,我想区分:这个查询都很好,只是有太多记录,等待它,不,查询是“破碎”,不要等待它。 / p>

只是不会解决问题。您似乎需要halting problem的解决方案,这是计算机科学中一个根本难以解决的问题。

您必须确定运行查询的可接受时间,并设置超时。没有可靠的方法来预测它应该运行多长时间,除非通过查看其他类似查询之前运行了多长时间。也没有任何方法可以区分正确(但缓慢)的查询和永远运行的查询。当涉及WITH RECURSIVE或PL / PgSQL函数之类的事情时尤其如此。

答案 2 :(得分:2)

您可以在一个特定的类中执行查询,该类的对象位于一个单独的线程中,并等待对象退出超时:

databaseObject->performQuery();

QThread * th = databaseObject->thread();
th->quit();
th->wait(2000);

if(th->isRunning())
{
    th->terminate();
    return false;
}
else
    return true;