Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net NHibernate:Criteria查询在web应用程序中很慢,但在单元测试中很快,为什么?_Asp.net_Nhibernate - Fatal编程技术网

Asp.net NHibernate:Criteria查询在web应用程序中很慢,但在单元测试中很快,为什么?

Asp.net NHibernate:Criteria查询在web应用程序中很慢,但在单元测试中很快,为什么?,asp.net,nhibernate,Asp.net,Nhibernate,我遇到了一个问题,当我在单元测试中运行NHibernate中的条件查询时,它在不到一秒钟的时间内执行,但是当我尝试从web应用程序的上下文中运行它时,它会花费一分钟的时间。两者都在为相同的数据访问相同的数据库 我的NHibernate映射: var properties = new Dictionary<string, string>(); var configuration = new Configuration(); properties.Add("connection.pro

我遇到了一个问题,当我在单元测试中运行NHibernate中的条件查询时,它在不到一秒钟的时间内执行,但是当我尝试从web应用程序的上下文中运行它时,它会花费一分钟的时间。两者都在为相同的数据访问相同的数据库

我的NHibernate映射:

var properties = new Dictionary<string, string>();
var configuration = new Configuration();

properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
properties.Add("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
properties.Add("connection.release_mode", "on_close");
properties.Add("current_session_context_class", "web");
properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
properties.Add("connection.connection_string_name", "DBConnection");
configuration.Properties = properties;
SessionFactory = configuration.BuildSessionFactory();
var properties=newdictionary();
var配置=新配置();
添加(“connection.provider”、“NHibernate.connection.DriverConnectionProvider”);
添加(“proxyfactory.factory_class”,“NHibernate.Bytecode.defaultproxyFactory,NHibernate”);
添加(“连接.释放模式”,“打开/关闭”);
添加(“当前会话上下文类”、“web”);
添加(“方言”、“NHibernate.dialogue.mssql2005dialogue”);
添加(“connection.connection\u string\u name”、“DBConnection”);
configuration.Properties=Properties;
SessionFactory=configuration.BuildSessionFactory();
测试和web应用之间映射的唯一区别是当前的会话上下文类,在测试中它是线程静态的,但这似乎不是问题所在

查询的条件为:

var reports =   Session.CreateCriteria<Report>()
        .SetFetchMode("Site", FetchMode.Join)
        .SetFetchMode("Actions", FetchMode.Join)
        .SetResultTransformer(new DistinctRootEntityResultTransformer())
        .Add(Subqueries.PropertyIn("Site",
            SiteCriteria.GetSitesForUserWithPermission(user, Permission.SomePermission))))
        .List<Report>();
var reports=Session.CreateCriteria()
.SetFetchMode(“站点”,FetchMode.Join)
.SetFetchMode(“操作”,FetchMode.Join)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.Add(子查询.PropertyIn(“站点”),
SiteCriteria.GetSitesForUserWithPermission(user,Permission.SomePermission)))
.List();
我曾尝试使用NH Profiler提供帮助,但它没有提供任何有用的建议

编辑:在nhprofiler中进一步查看,我看到在例如测试中,查询持续时间是1ms/313ms(仅数据库/总计)。
但是对于这个网站,我只花了1ms/43698ms。NHibernate似乎很难映射实际对象。

单元测试和web应用程序之间的区别在于单元测试没有被记录。 我在log4net.config中添加了:

<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN" />
</filter>

单元测试和web应用程序之间的区别在于单元测试不会被记录。 我在log4net.config中添加了:

<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN" />
</filter>

Visual Studio调试器是罪魁祸首尝试在关闭调试的情况下运行应用程序(ctrl+F5),或从visual studio外部运行。我这样做了,我的应用程序运行起来和单元测试一样快

如果这解决了问题,您可以做一些事情来加速VS调试器,例如删除所有断点和删除.suo文件。有关更多信息,请参阅此帖子:

其他可能有帮助的事情:

  • 尝试为您连接的用户设置正确的默认数据库。在sql server本身上(例如使用SSM)而不是在任何配置中执行此操作
  • 使用app/web config:
    中的threshold属性完全关闭log4net日志记录
  • 在hibernate配置中设置默认的_模式
  • 在hibernate配置中关闭show_sql

  • Visual Studio调试器是罪魁祸首尝试在关闭调试的情况下运行应用程序(ctrl+F5),或从visual studio外部运行。我这样做了,我的应用程序运行起来和单元测试一样快

    如果这解决了问题,您可以做一些事情来加速VS调试器,例如删除所有断点和删除.suo文件。有关更多信息,请参阅此帖子:

    其他可能有帮助的事情:

  • 尝试为您连接的用户设置正确的默认数据库。在sql server本身上(例如使用SSM)而不是在任何配置中执行此操作
  • 使用app/web config:
    中的threshold属性完全关闭log4net日志记录
  • 在hibernate配置中设置默认的_模式
  • 在hibernate配置中关闭show_sql

  • 如何在Web应用程序中创建会话?我们有一个HttpModule,可以根据每个请求创建和构建/处置会话。如何在Web应用程序中创建会话?我们有一个HttpModule,可以根据每个请求创建和构建/处置会话。这正是我的问题。不要像我一样低估这个答案!只要尝试关闭所有log4net日志记录,您很可能会看到性能的大幅提升。要一次性关闭所有功能,请在config:UPDATE中指定阈值。显然,这不是我的问题:),但它确实加快了速度。看看我的答案,这正是我的问题。不要像我一样低估这个答案!只要尝试关闭所有log4net日志记录,您很可能会看到性能的大幅提升。要一次性关闭所有功能,请在config:UPDATE中指定阈值。显然,这不是我的问题:),但它确实加快了速度。请参阅我的答案以获得解决方案。