Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fluent nhibernate Fluent nHibernate启动时间缓慢_Fluent Nhibernate_C# 4.0 - Fatal编程技术网

Fluent nhibernate Fluent nHibernate启动时间缓慢

Fluent nhibernate Fluent nHibernate启动时间缓慢,fluent-nhibernate,c#-4.0,Fluent Nhibernate,C# 4.0,我正在使用流利的NHibernate,我喜欢它! 我有一个小问题:启动时间约为10秒,我不知道如何优化Fluent nHibernate 为了减少启动时间的问题,我把它放在一个线程上 有人能告诉我一个解决办法吗?并用修改后的代码回复以提高性能 我在电视上看到这样的画面: 但我不知道如何与Fluent nHibernate合作 我的代码如下: public static ISession ObterSessao() { System.Threading.Thread

我正在使用流利的NHibernate,我喜欢它! 我有一个小问题:启动时间约为10秒,我不知道如何优化Fluent nHibernate 为了减少启动时间的问题,我把它放在一个线程上

有人能告诉我一个解决办法吗?并用修改后的代码回复以提高性能

我在电视上看到这样的画面: 但我不知道如何与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;
    }

您只需要构建一次配置。目前,您每次获得会话时都在构建一个新配置。

首先,如果您所做的任何事情都会使线程的优先级变慢,请不要弄乱线程的优先级

其次,正如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();
}

Phill给出了正确的答案,但为了进一步了解NHibernate配置的序列化方法,您不必在每次启动应用程序时都重新构建它。这可能快一点,也可能不快一点,这取决于各种因素(主要是您拥有的映射数)——根据这一点

只是强调一下(基于回答评论中的一些后续QN),您应该序列化(NHibernate.Cfg.)配置对象,而不是SessionFactory


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

嗨,我如何将配置对象存储在文件中,这样当我再次运行程序时,我可以读取它(反序列化)并快速启动程序?我试图在上面的代码中序列化config对象,但它只返回了以下内容:您可以将代码放入静态构造函数中,并将SessionFactory分配给返回ISessionFactory的静态属性。然后调用obtersesao.OpenSession()是否有办法将工厂存储(序列化)到文件中,并在以后还原?因为我的应用程序是一个可执行程序,并且每次用户运行它时,都会有10秒的延迟。您可以通过将映射放在不同的程序集中来减少启动时间。使用GetExecutionGassembly将加载您的应用程序程序集,该程序集可能很大,需要花费时间来确定需要映射的内容。如果你有一个单独的程序集,比如说15个映射类,而没有别的。那会快得多。你可以缩短5秒,然后启动5秒是什么?这是一个链接,在你重构你的助手类之后可能会有所帮助。我如何将这个工厂保存到一个文件(序列化),当我的用户再次访问应用程序时,我读取文件,并恢复(反序列化)工厂?因为问题是工厂的创建和我的应用程序在客户机上运行,所以每次用户单击时,都会有大约10秒的延迟。@Tony,如果用户每次单击某个东西时确实有10秒的延迟,那么问题不在于流畅的配置,它一定在其他地方。通过缓存SessionFactory,您应该只在应用程序启动期间产生一次映射开销。你所说的10秒延迟只是在启动时吗?是的!这是我缺少的一点:fluent.Configure(Configuration cfg);要完成这个问题,我想我只需要另外一点:如何做相反的事情:从Fluent NHibernate访问NHibernate.Cfg.Configuration?有了这个,我将能够序列化和反序列化。我正在尝试这样做。在通过序列化获取保存配置的这一步中,我遇到了以下错误:无法将类型“FluentNHibernate.Cfg.FluentConfiguration”隐式转换为“NHibernate.Cfg.Configuration”嘿!成功了。我用它来做相反的事情:NHibernate.Cfg.Configuration Cfg=config.BuildConfiguration();//配置是FluentConfiguration@Tony,我假设您已经解决了问题,但如果没有,我不太理解您的问题,因此如果您可以发布一些示例代码来演示错误,我很乐意查看