私はミニプロファイラーでLINQ2SQLクエリーを返すようには見えないのですか?

私は2層のWebアプリケーションを持っています。 DataAccessおよびWebSite。

ですから、DataAccess層の私の dataContext.cs に、私はラッパーを追加しました...

  //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が呼び出されたときで、 new MyDataContext(porofiledConnection)を返す前のように見えます。

enter image description here

and in my business logic also in the DataAccess tier I made sure that the db context is all created with db = MyDataContext.Get() in stead of db = new MyDataContext();

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

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

 }

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

enter image description here

そして、このページではプロファイラーで実行したことがないので、ロード時に問題が発生する前に、使用したSQLを特定できません。

enter image description here

私は何か見落としてますか? SQLはキャッシュされていますか?私はいつもLinq2Sqlがそれをキャッシュしても、SQLを見たいと思っています。私は何を間違えたのですか?

1
すべてのSPとSPのみを持つ dbml は1つだけです。 linqを使って実際にデータを選択するわけではありません。それはそれに影響を及ぼしますか?私はSPがリモートサーバー上にあるため実行するまでの時間について興味があります。質問を少し詳細に更新しました
追加された 著者 ppumkin,
@アレックスよく私はそれをやった。 web.configと新しいSqlConnectionからconStringを取得しました。最初のページlaodは、私に SQLの複製を示してくれました。私はF5キーを押しました。私はそれがまだ二度呼ばれるデバッグから知っている!私は、dbをチェックし、それはまだすべてのリフレッシュでプロファイルされた接続を使用している! PS-そこにある静かな私のカルセスはそれほど悪いですか?
追加された 著者 ppumkin,
OK私は何かを考え出した。私がdev-env-serverを停止してプロジェクトを再実行すると、最初のページに私が探しているSQLが1つのボックスに表示されます!非常に最初のリフレッシュでは、それはいくつかのボックスとtimmingsが付属していますが、それ以上のSQL時間はありませんか?私はdevenvを止める。プロジェクトを同じようにもう一度やり直してください...ハァッ?
追加された 著者 ppumkin,
ああクリキ! @Alex Ye私は静的なdatacontextを取り出し、プライベートメンバーとして各呼び出しでそれを作成します...今は毎回動作します。ブルームバーグ! ?なぜ?!違いはなんですか?あなたは答えを投稿したいですか?
追加された 著者 ppumkin,
ちょっと推測すると、 var profiledConnection = new ProfiledDbConnection(新しいSqlConnection(ConnectionString)、MiniProfiler.Current); のような、他のコンテキスト接続を使用しないでデータコンテキストを作成してみてください。もう1つの理由 - なぜ MyProducts クラスに静的なデータコンテキストが必要ですか?
追加された 著者 Alex,
データコンテキスト静的であってはなりません。また、静的な DataContext プロパティはプロファイル接続を使用しません。
追加された 著者 Alex,
a:データアクセス していることを確認してください。それが:b:ページの上部に表示されたユーティリティメソッドを使ってデータコンテキストを取得しましたか?データコンテキストを作成する他のコードがある可能性はありますか?
追加された 著者 Marc Gravell,
つまり、すべてのコードが独自の new MyDataContext(...)を実行している可能性はありますか?私は言わなければならない:接続を得るためのデータコンテキストの作成は危険であり、動作することさえ保証されていない。データコンテキストは、それがそれを所有していると思った場合に接続を破棄する奇妙なルールを持っている。個人的には、データコンテキストの接続文字列を自分で外部に取り出し、2つの接続(直接およびラップ)を構成し、最後にプロファイルを渡してデータコンテキストを作成します接続
追加された 著者 Marc Gravell,

1 答え

MyOrders クラスに静的データコンテキストがあります。 DataContext には、エンティティの変更を追跡し、1つのビジネストランザクションでデータベースへのラウンドトリップを避けるための内部キャッシュがあります。それを静的に保つことは、内部キャッシュが当面増加し、適切に解放されないことを意味します。これは、プロファイラでクエリーが消失したためです。また、複数のユーザーが複数のスレッドから同じコンテキストにアクセスし、メモリリークが発生する可能性がある場合には、問題が発生する可能性があります。

MSDN の注釈:

一般に、 DataContext インスタンスは、1つの "ユニット   あなたのアプリケーションではその用語が定義されています。   軽量であり、作成するのに費用がかからない。典型的なLINQ to SQL   アプリケーションは、メソッドのスコープに DataContext のインスタンスを作成します。   関連する論理的集合を表す短命クラスのメンバー   データベース操作。

1つの詳細:

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

詳細については、Rick Strahlの記事 LinqからSQL DataContextまでのライフタイム管理

2
追加された
どうもありがとうございました。私はそれを静的にすることでかなりの問題を抱えていることに気付かなかった。私は今、単一のトランザクションに移動し、プロファイラーは素晴らしい作品です。 +1 +ビールタイムありがとうございます
追加された 著者 ppumkin,