2010-04-14 86 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