database - 语句超时:仅在 Web 会话上
问题描述
我有一个网站,在该网站上,某些报告是通过 PSQL ODBC 源使用 SQL 运行的。任何 SQL 运行时间超过 30 秒的报告似乎都会超时!
我曾尝试修改statement_timeout
PostgreSQL 中的设置,但这并没有帮助。我还尝试在 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)
解决方案
我曾尝试修改 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 命令。
推荐阅读
- django - 如果在 Django ImportExportModelAdmin 中不存在,则创建对象
- c# - 我怎样才能改变对象的起始位置,同时在移动时更新它的位置?
- r - 从数据框中删除“FALSE”和“NAs”
- c++ - switch 语句无范围 case-labels 中的显式初始化和默认初始化有什么区别?
- xaml - Xamarin 在图像下方堆叠文本
- css - 如何使用包含它的组件的 CSS 向内部 Angular 组件添加边距
- r - 无法在 R 中安装自定义库
- r - 如何将参数传递给 REST API?
- rust - Substrate Mutate 在更新成员时抛出错误
- r - 在同一图中显示经验 CDF 和理论 CDF