【问题标题】:Why does NHibernate session.Query<T>().Delete() timeout?为什么 NHibernate session.Query<T>().Delete() 超时?
【发布时间】:2018-09-24 13:13:06
【问题描述】:

我发现从 NHibernate 5.0 开始我可以调用下面的代码来删除一个表的所有记录:

session.Query<T>().Delete();

它在数据库上执行代码而不通过网络复制它,这应该会大大提高性能。 但是这个查询超时。

我收到以下错误:

Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

我尝试将连接字符串中的连接超时设置为 0 和 3600,但没有任何区别。

我的表只有大约 200 条记录。但是一列是base64编码的pdf,所以它很大,查询需要几秒钟。

我还能尝试什么?

【问题讨论】:

  • 我现在使用 session.Query().Timeout(600).Delete(); 设法克服了这个错误。但我觉得这是一个临时的解决方法。我希望能更好地解释/理解为什么需要这样做。
  • 您是否单独查看过您的数据库(SQL Server?)活动?例如,如果您运行查询DELETE FROM MyTable WHERE MyColumn = 1;(或任何正确的查询),性能如何?该表上是否有任何争用导致DELETE 被阻止?

标签: sql .net nhibernate


【解决方案1】:

听起来你需要增加命令超时时间。

请注意,connection timeout and command timeout 之间存在差异。

您可以使用 command_timeout NHibernate 会话配置属性为 NHibernate 创建的 ADO.NET 命令设置默认命令超时(以秒为单位)。有多种方法可以做到这一点,具体取决于您用于配置 NHibernate 的方法。以下是基础知识:http://nhibernate.info/doc/nhibernate-reference/session-configuration.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多