2010-04-14 57 views
3

是NHibernate的新功能。当执行下面的测试用了11.2秒(调试模式) 我看到在我所有的测试这个大的启动时间(基本上创造了第一届会议花费大量的时间)NHibernate + Fluent长启动时间

设置=的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

using System; 
using System.Collections; 
using System.Data; 
using System.Globalization; 
using System.IO; 
using System.Text; 
using System.Data; 
using NUnit.Framework; 
using System.Collections.Generic; 
using System.Data.Common; 
using NHibernate; 
using log4net.Config; 
using System.Configuration; 
using FluentNHibernate; 

[Test()] 
     public void GetEmailById() 
     { 

      Email result; 

      using (EmailRepository repository = new EmailRepository()) 
      { 
       results = repository.GetById(1111); 
      } 

      Assert.IsTrue(results != null); 
     } 

//In my Repository 

    public T GetById(object id) 
     { 
      using (var session = sessionFactory.OpenSession()) 
      using (var transaction = session.BeginTransaction()) 
      { 
       try 
       { 
        T returnVal = session.Get<T>(id); 
        transaction.Commit(); 
        return returnVal; 
       } 
       catch (HibernateException ex) 
       { 
        // Logging here 
        transaction.Rollback(); 
        return null; 
       } 
      } 
     } 

查询时间是非常小的。由此产生的实体非常小。后续查询没问题。

它似乎正在开始第一次会议。

有没有其他人看过类似的东西?

EDIT1:

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(); 
} 
+2

你应该得到类似dottrace的东西,看看时间在哪里燃烧。可能是你第一次连接到数据库的东西..? – flq 2010-04-14 15:04:12

+1

可以请你展示SessionFactory初始化的代码以及从这段代码中调用的地方吗? – 2010-04-14 15:52:52

+0

你有多少个映射类? – 2010-04-14 16:24:38

回答

4

你可以看看this。基本上,这是关于首次保持您的配置,然后将其反序列化以供稍后重新使用。

+2

我最终坚持配置到类似于您的链接中提到的磁盘。这将加载时间减少到约2秒(从11.2开始)。谢谢。 – PaRa 2010-04-19 11:50:50

1

是否使用log4net的调试级别的? NHibernate的appender会在这个级别进行同义,除非你对它进行了不同的配置。它在DEBUG级别记录了很多信息,这是加速时间很慢的常见原因。试着改变了NHibernate的附加目的地只有一级,例如:

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

我正在使用log4.net(仅用于测试目的),我禁用它,但它没有什么影响时间,无论如何感谢 – PaRa 2010-04-14 16:58:11

3

每次新建一个存储库时,都不应该新建一个SessionFactory。

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

如果您进行此更改,您的表现应该回到正常/预期的表现。

+0

你的权利,谢谢你的帮助 – PaRa 2010-04-19 11:51:13