【问题标题】:Why can't I override statement_timeout in Dapper?为什么我不能在 Dapper 中覆盖 statement_timeout?
【发布时间】:2021-12-22 19:46:54
【问题描述】:

我在全局范围内设置了 postgresql 语句超时,如下所示:

ALTER ROLE user SET statement_timeout = '10s';

当我有一个长时间运行的查询时,我可以像这样覆盖超时,它可以在我的 DB IDE 中正常工作:

SET statement_timeout TO '0';
SELECT pg_sleep(20);

但是当我从 Dapper 执行相同的操作时,它会抛出异常:

57014: canceling statement due to statement timeout

我怎样才能让它在 Dapper 中工作?

【问题讨论】:

  • 为什么不设置命令超时呢?
  • 因为命令超时是另一回事(客户端超时与服务器端超时)
  • 它们指的是相同的超时时间,通过不同的机制设置。为什么要设置这么短的全局超时?你有阻塞或锁定问题吗?这不会解决他们。服务器仍将使用资源来处理这些不长的查询并丢弃结果。最好找出并解决问题(可能是缺少索引?长事务会导致冲突增加?)
  • 如果问题是由长事务引起的阻塞,解决方法是使用长事务。乐观并发可以将可伸缩性提高 几个 个数量级。
  • 不,它们指的不是同一个超时时间。

标签: c# sql postgresql dapper npgsql


【解决方案1】:

statement_timeout 设置仅从通过网络发送的下一条语句开始生效。我的 IDE 一个接一个地发送多个语句,而 Dapper 在一次往返中将它们全部发送。所以为了解决这个问题,我不得不把事情分成 2 个Execute 调用:

c.Execute("SET statement_timeout TO '0';");
c.Execute("SELECT pg_sleep(20);");

顺便说一句,SET 应用于会话,而SET LOCAL 应用于事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多