2010-12-07 21 views
6

私はFluent NHibernateを使用しています。 私は少し問題があります:起動時間は約10秒です。Fluent nHibernateを最適化する方法はわかりません この起動時間をあまり問題にならないように、スレッドに入れます。流暢nハイバーネイト遅いスタートアップ時間

誰かが解決策を教えてもらえますか?また、以下のコードを修正してパフォーマンスを改善してください。

私が上でこのような何かを見ました: http://nhforge.org/blogs/nhibernate/archive/2009/03/13/an-improvement-on-sessionfactory-initialization.aspx が、私は流暢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; 
    } 

答えて

2

フィルは正しい答えを持っていますが、それを少し取るためにさらに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?

(回答のコメントのいくつかのフォローアップqnsに基づいて) SessionFactoryではなく、(NHibernate.Cfg。)Configurationオブジェクトをシリアライズする必要があります。

FluentConfigurationを作成するときに、自動的にその設定を注入するのではなく、Fluently.Configure(Configuration cfg)オーバーロードを使用して設定を注入します。

+0

はい!それが私が逃した1つのポイントです:Fluently.Configure(設定cfg);この質問を終了するには別の要点が必要だと思います。その逆を行う方法:Fluent nHibernateからNHibernate.Cfg.Configurationにアクセスしますか?これで、シリアライズとデシリアライズが可能になります。 – Tony

+0

私はこれをしようとしています。シリアル化を介して保存するための設定を取得するこの段階で、私はこのエラーが発生しています: 'FluentNHibernate.Cfg.FluentConfiguration'を暗黙的に 'NHibernate.Cfg.Configuration'に変換できません。 – Tony

+1

Hey!出来た。私はこれを逆にするのに使った。NHibernate.Cfg.Configuration cfg = config.BuildConfiguration(); //設定はFluentConfiguration – Tony

5

。現時点では、セッションを開始するたびに新しい設定を作成しています。

+1

こんにちは、設定オブジェクトをファイルに保存すると、プログラムを再実行するときに読み込み(デシリアライズ)、プログラムを高速で起動できますか?上記のコードで設定オブジェクトをシリアライズしようとしましたが、これは返されました:<?xml version = "1.0"?> Tony

+0

あなたのコードを静的コンストラクタに入れ、SessionFactoryをISessionFactoryを返す静的プロパティに割り当てることができます。その後、obtersesao.OpenSession()を呼び出します。 – Phill

+0

ファクトリをファイルに保存(シリアル化)して後で復元する方法がありますか?私のアプリケーションは実行ファイルであり、ユーザーがそれを実行するたびに10秒の遅延があります。 – Tony

2

まず、スレッドの優先順位を混乱させないでください。実行している処理が遅くなる場合は、

第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(); 
} 
+0

私はこの_factoryをファイル(シリアライズ)に保存することができます。ユーザーがアプリケーションを再読み込みすると、ファイルが読み込まれ、_factoryが復元されます(デシリアライズされます)。問題はファクトリの作成であり、アプリケーションはクライアントマシン上で実行されるため、ユーザーがクリックするたびに約10秒の遅延が発生します。 – Tony

+0

@トニー、あなたのユーザーが何かをクリックするたびに本当に10秒の遅延がある場合、問題はFluent設定ではなく、他の場所にある必要があります。 SessionFactoryをキャッシュすることで、アプリケーションの起動時にマッピングオーバーヘッドが1回だけ発生します。起動時にのみ話す10秒の遅延ですか? – joshperry