【问题标题】:NHibernate + Fluent long startup timeNHibernate + Fluent 启动时间长
【发布时间】:2010-04-15 08:32:10
【问题描述】:

我是 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

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;
                }
            }
        }

查询时间非常短。生成的实体非常小。后续查询就好了。

它似乎正在开始第一个会话。

有没有人见过类似的东西?

编辑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(); 
}

【问题讨论】:

  • 你应该得到类似 dottrace 的东西,看看时间花在了哪里。可能是您第一次连接到数据库时发生的事情..?
  • 能否请您显示 SessionFactory 初始化的代码以及从该代码中调用的位置?
  • 你有多少个映射类?
  • 5 个映射类 SessionFactory 在存储库创建上完成: public RepositoryBase() { config = Fluently.Configure() .Database(OracleClientConfiguration.Oracle10 .ConnectionString(c => c.FromConnectionStringWithKey("DBCONSTRING") ) .Driver().ShowSql()) .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .BuildConfiguration(); sessionFactory = config.BuildSessionFactory(); }
  • 嗨。我做了一个“dottrace”,45% 的时间都在等待创建工厂,这正常吗:(

标签: performance nhibernate fluent-nhibernate


【解决方案1】:

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

【讨论】:

  • 我最终将配置保存到磁盘,类似于您的链接中提到的。这将加载时间减少到大约 2 秒(从 11.2 秒)。谢谢。
【解决方案2】:

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

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

如果您做出这种改变,您的表现应该会恢复到正常/预期的表现。

【讨论】:

    【解决方案3】:

    您是否在 DEBUG 级别使用 log4net? NHibernate appender 也将在该级别记录,除非您以不同方式对其进行配置。它在 DEBUG 级别记录了很多信息,这是导致启动时间缓慢的一个非常常见的原因。尝试仅更改 NHibernate appender 的级别,例如:

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

    【讨论】:

    • 我使用 log4.net(仅用于测试目的),我禁用了它,但它对时代影响不大,无论如何谢谢
    猜你喜欢
    • 2011-04-10
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多