1

2層のWebアプリケーションがあります。DataAccessとWebSite。

そのためdataContext.cs、DataAccess層でラッパーを追加しました...

  //The autogenreated context when I made the linq2sql class
  public static MyDataContext DataContext
    {
        get
        {
            //We are in a web app, use a request scope
            if (HttpContext.Current != null)
            {
                if (HttpContext.Current.Items["dc"] == null)
                {
                    MyDataContext dc = new MyDataContext ();
                    HttpContext.Current.Items["dc"] = dc;
                    return dc;
                }
                else
                    return (MyDataContext )HttpContext.Current.Items["dc"];
            }
            else
            {
                if (dataContext == null)
                    dataContext = new MyDataContext ();



                return dataContext;
            }
        }
    }

    //the method I added to the autogenreated contex in 
    //an attempt to wrap the profiler around it
    public static MyDataContext Get()
    {
        var sqlConnection = new MyDataContext().Connection;
        var profiledConnection = new StackExchange.Profiling.Data.ProfiledDbConnection(sqlConnection, MiniProfiler.Current);

        return new MyDataContext(profiledConnection);
    }

つまり、これは、profileConnectionが呼び出されたとき、ただしreturn New MyDataContext(porofiledConnection)

ここに画像の説明を入力してください

また、私のビジネスロジックでは、DataAccess層でも、dbコンテキストがすべてではなくで作成されていることを確認しdb = MyDataContext.Get() ました。db = new MyDataContext();

public class MyOrders(){
  private static  MyDataContext db = MyDataContext.Get();

  public static List<model> GetOrderHistory(){
      var = db.MyStoredProcedure(args) //Inspecting here before execution
      //proces result and return list of model
      }

 }

さて、いくつかのページでSQL行を取得していたので、それらをクリックして検査することができました。しかし、私がサイトを閲覧した後、それはこれを表示するだけです-SQL行はもうありませんか?このページのように、SQLの重複がランダムに表示されます-しかし、リロードすると消えてしまいます。

ここに画像の説明を入力してください

また、これまでプロファイラーで実行したことがないこのページでは、読み込み時間の問題があり、使用したSQLを特定できません。

ここに画像の説明を入力してください

私は何か見落としてますか?SQLはキャッシュされていますか?Linq2SqlがSQLをキャッシュしている場合でも、SQLを常に確認したいと思います。私は何を間違えましたか?

4

1 に答える 1

2

クラスに静的データ コンテキストがありますMyOrdersDataContextエンティティの変更を追跡し、1 つのビジネス トランザクションでのデータベースへのラウンド トリップを回避するために、内部にキャッシュがあります。静的のままにしておくと、内部キャッシュが当分の間増加し、適切に解放されないことを意味します。これが、プロファイラーでクエリが表示されない原因である可能性があります。また、複数のユーザーが複数のスレッドから同じコンテキストにアクセスすると、メモリ リークが発生する可能性があります。

MSDNからのメモ:

一般に、DataContextインスタンスは 1 つの「作業単位」の間存続するように設計されていますが、アプリケーションでその用語が定義されています。DataContext は軽量で、作成に費用がかかりません。一般的な LINQ to SQL アプリケーションはDataContext、メソッド スコープで、または関連するデータベース操作の論理セットを表す有効期間が短いクラスのメンバーとして、インスタンスを作成します。

もう1

のインスタンスを再利用しようとしないでくださいDataContext。それぞれDataContext が、1 つの特定の編集/クエリ セッションの状態 (ID キャッシュを含む) を維持します。データベースの現在の状態に基づいて新しいインスタンスを取得するには、 new を使用しますDataContext

詳細については、Rick Strahl の記事Linq to SQL DataContext Lifetime Management を参照してください。

于 2013-02-07T17:34:27.297 に答える