Performance NHibernate+;启动时间长

Performance NHibernate+;启动时间长,performance,nhibernate,fluent-nhibernate,Performance,Nhibernate,Fluent Nhibernate,我是新来的。执行以下测试时花费11.2秒(调试模式) 我在所有测试中都看到了这么长的启动时间(基本上创建第一个会话需要花费大量的时间) 安装程序=Windows 2003 SP2/Oracle10gR2 最新CPU/ODP.net 2.111.7.20/FNH 1.0.0.636/NHibernate 2.1.2.4000/NUnit 2.5.2.9222/VS2008 SP1 使用系统; 使用系统集合; 使用系统数据; 利用制度全球化; 使用System.IO; 使用系统文本; 使用系统数据;

我是新来的。执行以下测试时花费11.2秒(调试模式) 我在所有测试中都看到了这么长的启动时间(基本上创建第一个会话需要花费大量的时间)

安装程序=Windows 2003 SP2/Oracle10gR2 最新CPU/ODP.net 2.111.7.20/FNH 1.0.0.636/NHibernate 2.1.2.4000/NUnit 2.5.2.9222/VS2008 SP1

使用系统;
使用系统集合;
使用系统数据;
利用制度全球化;
使用System.IO;
使用系统文本;
使用系统数据;
使用NUnit.Framework;
使用System.Collections.Generic;
使用System.Data.Common;
使用NHibernate;
使用log4net.Config;
使用系统配置;
使用氟纤维酸盐;
[测试()]
public void GetEmailById()
{
电子邮件结果;
使用(EmailRepository repository=new EmailRepository())
{
结果=repository.GetById(1111);
}
Assert.IsTrue(结果!=null);
}
//在我的存储库中
公共T GetById(对象id)
{
使用(var session=sessionFactory.OpenSession())
使用(var transaction=session.BeginTransaction())
{
尝试
{
T returnVal=session.Get(id);
Commit();
返回值;
}
捕获(HibernateeException例外)
{
//在这里登录
transaction.Rollback();
返回null;
}
}
}
查询时间非常短。生成的实体非常小。随后的查询就可以了

第一节课似乎就要开始了

还有人见过类似的东西吗

编辑1:

public RepositoryBase()
{ 
  config = Fluently.Configure()
    .Database(OracleClientConfiguration.Oracle10 
    .ConnectionString(c => c.FromConnectionStringWithKey("DBCONSTRING"))
    .Driver<NHibernate.Driver.OracleDataClientDriver>().ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MYASSEM>()) 
    .BuildConfiguration(); 

  sessionFactory = config.BuildSessionFactory(); 
}
public RepositoryBase()
{ 
config=fluntly.Configure()
.Database(OracleClientConfiguration.Oracle10
.ConnectionString(c=>c.FromConnectionStringWithKey(“DBCONSTRING”))
.Driver().ShowSql())
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.BuildConfiguration();
sessionFactory=config.BuildSessionFactory();
}

您是否在调试级别使用log4net?NHibernate appender也将在该级别上运行,除非您对其进行不同的配置。它在调试级别记录了大量信息,这是导致统计时间缓慢的一个常见原因。尝试仅更改NHibernate appender的级别,例如:

   <log4net>
    <root>
      <appender-ref ref="SqlServerAppender" />
      <level value="DEBUG" />
    </root>
    <logger name="NHibernate">
      <level value="ERROR"/>
    </logger>
   </log4net>

您可以看看。基本上,这是关于第一次持久化配置,然后反序列化它以便以后重用。

您不应该每次新建存储库时都新建SessionFactory

每次应用程序运行(包括单元测试)只应创建一次SessionFactory。这是一个非常耗时的操作


如果您进行了更改,您的性能应该会恢复到正常/预期性能。

您应该获得类似dottrace的内容,并查看时间在哪里消耗。很可能是您第一次连接到数据库时遇到的问题。您可以显示SessionFactory初始化的代码以及从该代码中调用该代码的位置吗?您有多少个映射类?5个映射类SessionFactory在repository create:public RepositoryBase()上完成{config=fluntly.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(c=>c.fromConnectionString WithKey(“DBCONSTRING”)).Driver().ShowSql()).Mappings(m=>m.FluentMappings.AddFromAssemblyOf()).BuildConfiguration();sessionFactory=config.BuildSessionFactory();}您好。我在等待创建工厂的45%时间里做了“点跟踪”,这正常吗:(我使用的是log4.net(仅用于测试目的),我禁用了它,但是它对时间几乎没有影响,无论如何,谢谢。我最终将配置保存到磁盘上,与您的链接中提到的类似。这将加载时间减少到大约2秒(从11.2)。谢谢。
   <log4net>
    <root>
      <appender-ref ref="SqlServerAppender" />
      <level value="DEBUG" />
    </root>
    <logger name="NHibernate">
      <level value="ERROR"/>
    </logger>
   </log4net>