流利的nHibernate慢启动时间

时间:2010-12-07 23:45:50

标签: fluent-nhibernate c#-4.0

我正在使用Fluent NHibernate,我喜欢它! 我有一个小问题:启动时间大约是10秒,我不知道如何优化Fluent nHibernate 为了使这个启动时间不那么成问题,我把它放在一个线程上。

有人能解决这个问题吗?并回复以下修改后的代码以提高性能?

我看到这样的事情: http://nhforge.org/blogs/nhibernate/archive/2009/03/13/an-improvement-on-sessionfactory-initialization.aspx 但是我不知道如何与Fluent nHibernate一起工作。

我的代码是这样的:

public static ISession ObterSessao()        
{
        System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;

        string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here

        var config = Fluently.Configure()
            .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString));

        config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()));

        var session = config
            .BuildSessionFactory()
            .OpenSession();

        System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Normal;

        return session;
    }

3 个答案:

答案 0 :(得分:5)

您只需要构建一次配置。目前,每次进行会话时都要构建新配置。

答案 1 :(得分:2)

首先,不要乱用线程优先级,如果你正在做什么会使它变慢。

其次,就像Phill所说,你需要缓存你的SessionFactory,否则你每次需要会话对象时都会重建配置。

你可以这样做,或者将if中的代码移动到类'静态构造函数中:

private static SessionFactory _factory = null;
public static ISession ObterSessao()        
{
    if(_factory == null) {
        string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here

        var config = Fluently.Configure()
            .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString));

        config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()));

        _factory = config.BuildSessionFactory();
    }

    return _factory.OpenSession();
}

答案 2 :(得分:2)

Phill有正确的答案,但为了进一步了解http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html将NHibernate配置序列化为文件,所以每次启动应用程序时都不必重建它。根据各种因素(主要是您拥有的映射数量),这可能会或可能不会更快一点 - 根据这一点,Is there any data on NHibernate vs Fluent NHibernate startup performance?

为了强调(基于你在answer-comments中的一些后续qns),你应该序列化(NHibernate.Cfg。)配置对象,而不是SessionFactory。

然后,在创建FluentConfiguration时使用Fluently.Configure(Configuration cfg)重载来注入配置(而不是让它自动为您构建一个)。