首页 > 解决方案 > 语句超时:仅在 Web 会话上

问题描述

我有一个网站,在该网站上,某些报告是通过 PSQL ODBC 源使用 SQL 运行的。任何 SQL 运行时间超过 30 秒的报告似乎都会超时!

我曾尝试修改statement_timeoutPostgreSQL 中的设置,但这并没有帮助。我还尝试在 ODBC 数据源管理器中设置语句超时,但这也无济于事。

有人可以请教一下为什么语句超时只会影响网络会话而不影响其他任何事情吗?

Web 日志和 PostgreSQL 数据库日志中显示的错误如下:

16:33:16.06 System.Data.Odbc.OdbcException (0x80131937): ERROR [57014] ERROR: canceling statement due to statement timeout;

我认为问题与 PostgreSQL 配置文件本身中的语句超时设置无关。我之所以这么说,是因为在 PGAdmin 中运行查询时我没有得到 30 秒的语句超时,我只有在我的网站上运行报告时才得到超时。该网站通过 PSQLODBC 驱动程序连接到 PostgreSQL 数据库。

尽管如此,我确实尝试在 PostgreSQL 配置文件中设置语句超时,并将语句超时设置为 90 秒,并且此更改对报告没有影响,它们在 30 秒后仍然超时(更改已应用,如show statement_timeout;显示更新值)。其次,我尝试通过 ODBC 数据源管理员数据源选项编辑连接设置,并使用以下命令在此处设置语句超时:SET STATEMENT_TIMEOUT TO 90000

更改已应用,但没有再次产生影响,并且语句仍然超时。

我还尝试通过运行类似于以下内容的查询来更改用户语句超时:

Alter User "MM" set statement_timeout = 90000;

这再次没有影响。Web 会话日志显示以下内容:

21:36:32.46 Report SQL Failed: ERROR [57014] ERROR: canceling statement due to statement timeout;
Error while executing the query
21:36:32.46 System.Data.Odbc.OdbcException (0x80131937): ERROR [57014] ERROR: canceling statement due to statement timeout;
Error while executing the query
   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Odbc.OdbcCommand.ExecuteReader()
   at Path.PathWebPage.SQLtoJSON(String strSQL, Boolean fColumns, Boolean fFields, String strODBC, Boolean fHasX, Boolean fHasY, Boolean fIsChart, String strUser, String strPass)

标签: databasepostgresqlodbcpgadmin

解决方案


我曾尝试修改 Postgres 中的 statement_timeout 设置,但这并没有帮助

请显示您尝试了什么,以及您在尝试时收到的错误消息(如果有)。此外,更改设置后,show statement_timeout;是否反映了您尝试进行的更改?显示什么select source from pg_settings where name ='statement_timeout'

在 PostgreSQL 的“库存”版本中,用户始终能够更改其会话的 statement_timeout 设置。一些自定义编译,如由托管提供商运行的编译,可能会阻止此类更改(希望有合适的错误消息)。

有几种方法可以设置为不同于 postgresql.conf 中指定的值。可以使用类似的东西在每个用户或每个数据库的基础上设置它alter user "webuser" set statement_timeout=30000(这将在用户下次登录时生效,或者有人登录到该数据库)。它可以在连接字符串中设置(虽然我不知道它在 ODBC 中是如何工作的)。或者,如果您的应用程序使用集中子例程来建立连接,则该代码可以set statement_timeout=30000在将连接返回给调用者之前对连接执行 SQL 命令。


推荐阅读