我在C#中遇到了NHibernate的问题。
当它想要执行查询时,应用程序面临ADO超时错误,但是当我使用SQL事件探查器捕获查询,然后我在SQL Server的新查询中运行它时,它只需要2秒< / p>
任何想法??
答案 0 :(得分:9)
从SQL事件探查器捕获查询并在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会生成一个使用索引查找并在&lt;中执行的计划。 2秒这在SSMS中是可重现的。
根本原因是NHibnerate默认使用DbType.String而不是DbType.AnsiString用于varchar列。我的解决方案是添加一个Fluent NHibernate约定来将所有字符串映射更改为AnsiString,这导致NHibernate创建提供参数为varchar的查询。
答案 1 :(得分:4)
当我处理尚未提交到数据库的事务并使用在同一对象上运行的不同事务时,我发现nhibernate超时发生..所以我建议你注意多个会话在你的内部应用程序,并确保不是这种情况,只使用1 ..
并使用nhibernate配置文件也是我建议的...... http://nhprof.com/ 它是一个很酷的工具..它实际上显示了向数据库发出的查询和检索到的行,并且非常容易使用。所有你需要做的是将连接字符串设置为你运行查询的dB和瞧,你可以看到所有你的查询,你可以对SQL分析器说再见。
希望有所帮助。