【问题标题】:Query got timeout error in NHibernate but not In SQL Server查询在 NHibernate 中出现超时错误,但在 SQL Server 中没有
【发布时间】:2012-08-02 04:28:48
【问题描述】:

我在 C# 中遇到了 NHibernate 问题。

当它想要执行一个查询时,应用程序面临 ADO 超时错误,但是当我使用 SQL Profiler 捕获查询,然后我在 SQL Server 的新查询中运行它时,恰好只需要 2 秒

有什么想法吗??

【问题讨论】:

  • 您好,您是否设法找出问题所在。我有点确定这是由于多个会话打开并在 smthing 上运行..

标签: c# sql-server nhibernate timeout


【解决方案1】:

当您从 SQL Profiler 捕获查询并在 SSMS 中运行时,您是否将其作为 sp_executesql 查询运行?我在使用 NHibernate 2.1GA 时遇到了类似的问题,这个答案适用于那个版本,我还没有转换到 NH3。 NH Profiler 是一个很棒的工具,但它有助于将 SQL 提取到格式化的查询中,该查询不代表发送到服务器的实际查询。

问题在于 NHibernate 向 sp_executesql 提供字符串参数的方式。字符串参数类型为 nvarchar,长度等于值的长度。例如,此查询限制了两列分别为 varchar(4) 和 varchar(20):

exec sp_executesql N'SELECT this_.Column0, this_.Column1 FROM MySchema.MyTable this_ WHERE this_.Column0 = @p0 and this_.Column1 = @p1',N'@p0 nvarchar(4),@p1 nvarchar(7)',@p0='Val0',@p1='Value01'

此查询计划使用索引扫描,耗时 17 秒。将 nvarchar 更改为 varchar 生成了一个使用索引查找并在

根本原因是 NHibnerate 默认使用 DbType.String 而不是 DbType.AnsiString 用于 varchar 列。我的解决方案是添加一个 Fluent NHibernate 约定以将所有字符串映射更改为 AnsiString,这导致 NHibernate 创建提供参数为 varchar 的查询。

【讨论】:

    【解决方案2】:

    我看到当您处理尚未提交到数据库的事务并使用对同一对象进行操作的不同事务时发生休眠超时.. 所以我建议您注意您的多个会话 poen应用程序并确保不是这种情况,只使用 1..

    我也建议使用 nhibernate 配置文件。http://nhprof.com/ 它是一个很酷的工具..它实际上显示了向 db 触发的查询和检索到的行,并且也非常易于使用..您需要做的就是将连接字符串设置为您运行查询所针对的 dB 和瞧,你可以看到你所有的查询,你可以告别 SQL 分析器。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      相关资源
      最近更新 更多