Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当数据库查询出错时检测和处理_Sql_Qt_Postgresql - Fatal编程技术网

Sql 当数据库查询出错时检测和处理

Sql 当数据库查询出错时检测和处理,sql,qt,postgresql,Sql,Qt,Postgresql,我的问题是我希望我的所有查询必须在有限的时间后返回结果。好的,postgres有两个选项用于此操作:connect\u timeout当打开与数据库的连接时,以及用于查询的statement\u timeout 这会导致两个问题: 我必须估计查询运行的时间。我的方法是设置 最坏的情况是:使用db服务器的预设带宽,查询 有很多记录。。。但我认为这不是一个明智的选择 方法有没有更好的想法/模式。。。来处理这个 网络问题。假设网络因重数据包而损坏 输了,高平死定了。。。来自客户端的查询,以及来自 服务

我的问题是我希望我的所有查询必须在有限的时间后返回结果。好的,
postgres
有两个选项用于此操作:
connect\u timeout
当打开与数据库的连接时,以及用于查询的
statement\u timeout

这会导致两个问题:

  • 我必须估计查询运行的时间。我的方法是设置 最坏的情况是:使用db服务器的预设带宽,查询 有很多记录。。。但我认为这不是一个明智的选择 方法有没有更好的想法/模式。。。来处理这个

  • 网络问题。假设网络因重数据包而损坏 输了,高平死定了。。。来自客户端的查询,以及来自 服务器被卡住了。。。当然我们可以设定一个 代码超时,但我认为由于 处理资源和其他事情,它与 数据库超时机制。有没有办法处理这件事

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

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


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

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


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

    正如你已经提到的,这是很好的选择rd预测查询运行的时间(由于查询本身及其参数、由于网络、由于服务器负载)

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


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

    你可以在指定的时间内执行查询ic类,其对象位于单独的线程中,并等待对象退出超时:

    databaseObject->performQuery();
    
    QThread * th = databaseObject->thread();
    th->quit();
    th->wait(2000);
    
    if(th->isRunning())
    {
        th->terminate();
        return false;
    }
    else
        return true;
    

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

    databaseObject->performQuery();
    
    QThread * th = databaseObject->thread();
    th->quit();
    th->wait(2000);
    
    if(th->isRunning())
    {
        th->terminate();
        return false;
    }
    else
        return true;
    
    你想做什么:

    当一个查询花费很长时间时,我想区分:这个查询都很好,只是有太多记录,等待它,不,查询是“坏的”,不要等待它

    你似乎需要一个解决方案,这是计算机科学中的一个基本难题

    您必须确定查询可以运行多长时间,并设置一个超时。没有可靠的方法来预测它应该运行多长时间,除非查看以前运行其他类似查询所用的时间。也没有任何方法来区分正确的(但速度慢的)查询查询和一个将永远运行的查询。当涉及使用递归或PL/PgSQL函数的
    时尤其如此。

    您想做什么:

    当一个查询花费很长时间时,我想区分:这个查询都很好,只是有太多记录,等待它,不,查询是“坏的”,不要等待它

    你似乎需要一个解决方案,这是计算机科学中的一个基本难题


    您必须确定查询可以运行多长时间,并设置一个超时。没有可靠的方法来预测它应该运行多长时间,除非查看以前运行其他类似查询所用的时间。也没有任何方法来区分正确的(但速度慢的)查询查询和一个将永远运行的查询。当涉及使用递归
    或PL/PgSQL函数的
    时尤其如此。

    您需要定义良好的超时用于什么目的?为什么认为它对您的应用程序很重要?我需要向上层报告信息。我的团队负责人想要一份报告,而不是什么运行很长一段时间。但是为什么您的团队领导会这样认为?他是否希望防止您的应用程序由于同步数据库访问而长时间阻塞?或者他是否认为查询不够重要,无法等待它们?是的,防止阻塞和其他一些事情。查询结果从一个数字到数十万不等记录,当它需要时间时,用户应该区分:这个查询都是好的,只是有太多的记录,等待它,没有,查询是“坏的”,不要等待,尽快联系技术支持…你真的需要数十万条记录吗?如果需要,你不介意稍等。如果不需要,为什么不限制结果或使用光标?你需要定义明确的超时用于什么目的?为什么认为它对你的应用程序很重要?我需要向upp报告信息er层。我的团队负责人想要一份报告,而不是长时间运行的报告。但为什么您的团队负责人这么认为?他是想防止您的应用程序由于同步数据库访问而长时间阻塞?还是他认为查询不够重要,无法等待它们?是的,防止阻塞和其他几件事。查询可以恢复ult从一个数字到数十万条记录不等,当需要时间时,用户应该区分:此查询都很好,只是有太多记录,等待它,而不是,查询已“中断”,不要等待它,请联系技术支持