我的问题是我希望我的所有查询都必须在有限的时间后返回结果。 AFAIK,postgres
有2个选项:connect_timeout
打开与数据库的连接,statement_timeout
表示查询。
这导致了2个问题:
我必须估计查询运行的时间。我的方法是设置 最糟糕的情况:使用预设带宽到数据库服务器,查询 有很多记录...来确定它,但我认为这不是一个聪明的 办法。是否有更好的想法/模式......来处理这个问题?
网络问题。假设网络很重,数据包很重 丢失,高ping作为地狱...来自客户端的查询,以及来自的结果 服务器卡住...当然我们可以设置一个 从代码中超时,但我认为它会因为复杂而变得复杂 处理资源和其他东西,并与它重复 数据库超时机制。无论如何都要处理这个问题吗?
故事的另一个版本:当一个查询花了很长时间,我想区分:这个查询都很好,只是有太多记录,等待它,不,查询是“破碎”,不是等等......
Ps:我找到了这个链接,但这是针对SQL Server 2005的:(
答案 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;