C# 查询在NHibernate中出现超时错误,但在SQL Server中没有

C# 查询在NHibernate中出现超时错误,但在SQL Server中没有,c#,sql-server,nhibernate,timeout,C#,Sql Server,Nhibernate,Timeout,我对C#中的NHibernate有意见 当它想执行一个查询时,应用程序会面临一个ADO超时错误,但是当我使用SQL Profiler捕获查询,然后在SQL Server的新查询中运行它时,恰好只需要2秒钟 有什么想法吗?当您处理一个尚未提交到数据库的事务并使用在同一对象上运行的不同事务时,我看到了nhibernate超时。。因此,我建议在你的应用程序中寻找多个会话poen,并确保不是这样,只使用1 我还建议使用nhibernate配置文件。。 这是一个很酷的工具。。它实际上显示了对数据库的查询以

我对C#中的NHibernate有意见

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


有什么想法吗?

当您处理一个尚未提交到数据库的事务并使用在同一对象上运行的不同事务时,我看到了nhibernate超时。。因此,我建议在你的应用程序中寻找多个会话poen,并确保不是这样,只使用1

我还建议使用nhibernate配置文件。。 这是一个很酷的工具。。它实际上显示了对数据库的查询以及检索到的行,并且非常易于使用。您只需将连接字符串设置为运行查询所针对的数据库,您就可以看到所有的查询,并向SQL profiler告别


希望对您有所帮助。

当您从SQL Profiler捕获查询并在SSMS中运行时,是否将其作为sp_executesql查询运行?我在使用NHibernate2.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生成了一个使用索引搜索的计划,并在<2秒内执行。这在SSMS中是可复制的


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

HI所以你设法解决了这个问题。。我有点确定这是因为在smthing上打开了多个会话并进行了操作。。