当前位置: 首页 > 面试题库 >

如何设置语句超时以执行查询

巫马嘉祯
2023-03-14
问题内容

在我的Web应用程序中,一些postgres sql查询需要一些时间才能执行。我只想为其中一部分设置语句超时。

查询的一部分必须通过超时取消,但是其他部分必须可以不受任何限制地工作。

在postgres中存在statement_timeout函数。

如何使用statement_timeout函数包装SqlAlchemy查询?

像这样:

SET statement_timeout TO 1000; -- timeout for one second
<sqlalchemy generated query>;
RESET statement_timeout; -- reset

对我来说,设置超时的最佳方法是这样的:

users = session.query(User).timeout(0.5).all()

SqlAlchemy必须:1)设置语句超时2)执行查询并返回结果3)当前会话的重置语句超时

可能是设置查询执行超时的其他方法吗?

更新1. 我的解决方案

我的解决方案是自定义连接代理(使用psycopg2 == 2.4和SQLAlchemy == 0.6.6测试):

from sqlalchemy.interfaces import ConnectionProxy

class TimeOutProxy(ConnectionProxy):
    def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):

        timeout = context.execution_options.get('timeout', None)

        if timeout:
            c = cursor._parent.cursor()
            c.execute('SET statement_timeout TO %d;' % int(timeout * 1000))
            c.close()

        return execute(cursor, statement, parameters, context)


engine = create_engine(URL, proxy=TimeOutProxy(), pool_size=1, max_overflow=0)

此解决方案无需重置statement_timeout,因为在隔离的事务中执行的每个SqlAlchemy查询和在当前事务中定义的statement_timeout。

使用示例(以秒为单位的超时参数):

Session.query(Author).execution_options(timeout=0.001).all()

Session.bind.execute(text('select * from author;') \
      .execution_options(timeout=0.001)) \
      .fetchall()

问题答案:

您应该查看SQLAlchemy <= 0.6提供的扩展:

http://www.sqlalchemy.org/docs/06/orm/interfaces.html

您可以在钩子中粘贴代码以进行单个操作。

SQLAlchemy 0.7+现在有一个事件系统…可能有类似的东西。看到

http://www.sqlalchemy.org/docs/core/events.html



 类似资料:
  • 我正在练习Python,我想写一个程序来检查当前时间,看看它是否与2:12 pm匹配,并说:所以首先我想要使用模块,但我不知道如何使用? 我的问题是我不知道如何使用时间模块。或者我用的语法对不对? 我的代码:

  • 我正在使用Spring框架。使用NamedParameterJdbcTemplate时,如何设置查询超时?我注意到JdbcTemplate有一个setQueryTimeout(int queryTimeout)方法,但我还没有找到一种使用NamedParameterJdbcTemplate实现这一点的方法。它有一个getJdbcOperations()方法,但似乎没有公开setQueryTimeo

  • 问题内容: 我已经按照kuester2000的回答进行了操作,但是我的超时设置似乎不起作用。 但是,超时值不变。 在我链接的答案中,它还说: 连接超时抛出“ java.net.SocketTimeoutException:套接字未连接”,套接字超时抛出“ java.net.SocketTimeoutException:操作超时”。 但是我都没有。相反,我收到“ org.apache.http.co

  • 我有一个TcpClient,用于将数据发送到远程计算机上的侦听器。远程计算机有时打开,有时关闭。因此,TCP客户端将经常无法连接。我希望TcpClient在一秒钟后超时,这样当它无法连接到远程计算机时就不会花费太多时间。目前,我对TcpClient使用以下代码: 这对于处理任务来说已经足够好了。如果可以,它会发送它,如果无法连接到远程计算机,它会捕获异常。然而,当它无法连接时,抛出异常需要10到1

  • 我写了以下代码: 演示 JLS 14.10说: 当且仅当主机系统已确定词汇上包含assert语句的顶级类启用断言时,才会启用在其类完成初始化后执行的assert语句。 我以为我在类中通过assert true启用了断言,但它仍然不起作用。我如何才能启用关于所说内容的断言?

  • 问题内容: 我目前从EntityManager查询中收到连接超时错误。是否可以为这些设置超时? persistence.xml 代码在我的线程的运行功能中超时: 我收到的超时错误: 问题答案: 是的,那里有 javax.persistence.query.timeout 。根据JPA 2.0规范,对此查询提示的支持是可选的: 可移植应用程序不应依赖此提示。根据使用的持久性提供程序和数据库,可能会或