1

こんにちは。mono で使用するために、かなり大規模なプロジェクトを Fluent NHibernate に移行しています。主要な機能のほとんどは正常に動作していますが、メモリに問題があります。

現在、このコードは 2 つのコントローラーにあります。これは、少しでも最適とは思えません。しかし、これをどこに置くか迷っています。

 private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
           .Database(MySQLConfiguration.Standard.ConnectionString(
           c => c.FromConnectionStringWithKey("DashboardModels")
       ))
   .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Accounts>())
   .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Notes>())
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Sales_Forecast>())
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ChangeLog>())
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Tasks>())

   .BuildSessionFactory();
    }
    ISessionFactory sessionFactory = CreateSessionFactory();

私のdb呼び出しのほとんどはAJAXで、一度にいくつかの呼び出しがあります。これにより、リリースされていないセッションを作成しすぎていると思われます。

  public ActionResult ReadAccounts([DataSourceRequest] DataSourceRequest request)
    {
        DataSourceResult result;

        using (var session = sessionFactory.OpenStatelessSession())
        using (var tx = session.BeginTransaction())
        {
            var customers = from customer in session.Query<Accounts>().AsNoTracking()
                            where !customer.Deleted
                            select customer;
            result = customers.ToDataSourceResult(request);
            tx.Commit();
        }
    return Json(result, JsonRequestBehavior.AllowGet);


    }

データのみを返すメソッドに StatelessSessions を使用していると考えてください。

  public JsonResult GetNoteInfo(int id = 0)
    {
        Notes note;
        using (var session = sessionFactory.OpenStatelessSession())
        using (var tx = session.BeginTransaction())
        {
             note = (from notes in session.Query<Notes>().AsNoTracking()
                        where notes.Note_ID == id
                        select notes).FirstOrDefault();
             tx.Commit();
            return Json(JsonResponseFactory.SuccessResponse(note), JsonRequestBehavior.DenyGet);
        }
    }

前述したように、これは機能していますが、どうすればメモリ パフォーマンスを向上させることができますか? 一番下の方法に似た方法で同時に発火する方法が5つほどあるので、以前にこれを行ったことがある人は、メモリが急速に拡張しないようにする方法についてアドバイスをいただければ幸いです。お時間をいただき、楽しいコーディングをありがとうございました!

4

2 に答える 2

3

コントローラはリクエストごとにインスタンス化されます。コントローラーが作成されるたびに CreateSessionFactory() を呼び出しているようです。これは非常に時間のかかる呼び出しであり、通常はアプリケーションの存続期間中に 1 回だけ実行する必要があります。一般的な方法は、Global.asax でこれを処理することです。

セッションに関しては、それらを using ステートメントでラップしているため、接続などを確実に閉じることができるため、この部分は私には正しいように見えます。

于 2013-01-31T07:42:52.757 に答える
0

これが私が個人的に問題を解決した方法です (DotJoe、Oskar Berggren、およびこのサイトの他の人の助けを借りて)

Global.asax.cs

public static ISessionFactory SessionFactory =
         SessionProvider.BuildSessionFactory();

コントローラ

public ActionResult ReadAccounts([DataSourceRequest] DataSourceRequest request)
{
    DataSourceResult result;

    using(ISession session = MvcApplication.SessionFactory.OpenSession())
    {
        using (ITransaction tx = session.BeginTransaction())
        {
            var customers = session.Query<Accounts>().Where(a => a.Deleted == false).AsNoTracking();
            //from customer in session.Query<Accounts>().AsNoTracking()
            //                where !customer.Deleted
            //                select customer;
            result = customers.ToDataSourceResult(request);
            tx.Commit();
        }
    }
    return Json(result, JsonRequestBehavior.AllowGet);
}

次に、Utilities というフォルダーにクラスを作成しました。

SessionFactory.cs

public class SessionProvider  
{
 public static ISessionFactory BuildSessionFactory()
 {
 return Fluently.Configure()
      .Database(MySQLConfiguration.Standard.ConnectionString(
      c => c.FromConnectionStringWithKey("DashboardModels")
  ))
 .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Accounts>())
 .BuildSessionFactory();

 }
}

このコードが、ピンチで EF から NHibernate に変換する必要がある他の人に役立つことを願っています。

これにより、145 人のユーザーがいるかなり大きなアプリケーションのメモリ管理を 450,000kb 強に抑えることができました。(EF を使用して 600,000kb から減少) NHibernate のスケーラビリティの証です。

NHProf も強くお勧めします。優れた提案があり、特定の問題に対するリソースを提供します。

Mono を使用する場合は、これが私の意見です。

于 2013-01-31T21:37:34.913 に答える