2011-06-28 8 views
3

私はSubSonic 3の最近の(極端な)パフォーマンス問題については、可能な限り小さなコード(Linqのほとんど)を書き直して、ORMを移行することを検討しています。BLToolkit with Linq - なぜ `using`文が必要ですか?

私はBLToolkitを見ています。 SubSonicとBLToolkitの主な違いの1つですが、BLToolkitでは常にusingというステートメントが必要です。たとえば、

static void SingleTableTest() 
{ 
    using (var db = new NorthwindDB()) //This 
    { 
     var query = 
      from e in db.Employee 
      where e.EmployeeID > 5 
      orderby e.LastName, e.FirstName 
      select e; 

     foreach (var employee in query) 
     { 
      Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName); 
     } 
    } 
} 

正確にはどうなりますか?データベースの新しいインスタンスを作成すると、新しい接続が作成されますか?これを静的なクラスに「ラップ」して、どこからでもできることは合理的でしょうかvar q=from e in Database.Employee ...?これはウェブアプリケーションの文脈でどのような影響を与えるでしょうか?

+1

接続は可能な限り最小限の作業単位に限定する必要があります。私は特にこのフレームワークに精通していませんが、EFやLinqToSqlのようなあなたのコネクションを管理している可能性が高いです。 –

+0

コードの私の見解によれば、新しい 'db 'ステートメントごとに新しい接続が作成されます。私はSubSonicを見て、自作の「SharedConnectionScope」を使って、接続が自動的に開いて閉じられるようにしました。 – Earlz

+0

これは、毎回データベース接続オブジェクトの新しいインスタンスを作成している可能性がありますが、データベースサーバーへのまったく新しいネットワーク接続を作成すべきではありません。 .NETはデフォルトで接続プーリングを行います。 –

答えて

4

あなたの例のNorthwindDBクラスはDbManagerに基づいていると思います。 DbManagerはConnectionのラッパーであり、接続のように動作します。別のクラスDataContextを試す必要があります。あなたのシナリオに合わせて設計されています。

+0

T4テンプレート(BLtoolkitに含まれているもの)を作成する方法は、DbManagerの拡張方法に似た拡張DataContextを生成する方法はありますか? – Earlz

+0

テンプレートにBaseDataContextClass = "DataContext"を追加するだけです。 before LoadMetadata();/GenerateModel(); –

0

私はBLToolkitについてはわかりませんが、Entity FrameworkのようなものでHTTPリクエストごとに1つのオブジェクトを使用できるかどうかを知りたかったというコメントから、 usingステートメントの代わりに、global.asaxのApplication_BeginRequestイベントでdbオブジェクトを作成します。あなたはそれをApplication_EndRequestで処理します。 HttpContext.Current.Itemsにオブジェクトを格納することができます。これは、リクエストごとに便利なコレクションです。

私が言ったように、それはBLToolkitに特に当てはまるかどうかはわかりません。なぜなら、私はそれについて何も知らないからですが、うまくいけば正しい方向に向けることができます。 :)

+0

まあ、あなたはそれを行うことができるように見えます..多分。この問題は、SqlReaderが開いたままになっている場合にのみ発生します。私はちょうどそれを試み、何かが壊れているのを見てより良い運を持っている可能性があります – Earlz

関連する問題