NHibernate + Fluent长启动时间

时间:2010-04-14 15:01:30

标签: performance nhibernate fluent-nhibernate

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

  

setup = 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(); 
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

如果您进行了更改,您的表现应该会恢复正常/预期的效果。

答案 2 :(得分:1)

您是否在DEBUG级别使用log4net? NHibernate appender将在该级别进行alsolog,除非您以不同方式配置它。它在DEBUG级别记录了大量信息,这是导致状态缓慢的常见原因。尝试仅更改NHibernate appender的级别,例如:

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