2009-09-09 23 views
2

私はいくつかの未解決の問題を証明するまで、私は新しい技術を使用することに移行することができないので、私の上司と一緒になっています。主な問題の1つは、リポジトリが接続を処理する方法です。おそらく最大のオーバーヘッドの1つは、データベースへの接続およびデータベースからの切断です。リポジトリ接続プール

public ContractsControlRepository() 
    : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

そうのようなクラスを::のような機能を持つ

public class ContractsControlRepository : DataContext, IContractsControlRepository 

:私は、私は次のようにしますリポジトリがある場合

public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID) 
{ 
    string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}"; 
    return this.ExecuteQuery<COContractCostCentre>(query, contractID); 
} 

今私のコントローラのアクションで呼び出された場合を_contractsControlRepository.ListContractCostCentres(2)直後にリポジトリへの別の呼び出しが行われ、同じ接続が使用されますか?コントローラではいつ接続が開いていますか?いつ閉じますか?彼のASP.NET MVC bookSteve Sandersonにより示唆されるように、私は手書きLINQを使用してい

乾杯

EDIT

。明確にするために

編集編集

、私は私のORMとしてLINQを使用していますが、(上記の抜粋に示すように)私は、クエリのために生のSQLクエリを使用しています。たとえば、次のコントローラアクションがあります。

public ActionResult EditBusiness(string id) 
{ 
    Business business = _contractsControlRepository.FetchBusinessByID(id); 
    return View(business); 
} 

私は接続を開いたり閉じたりしません。ここで

が私のレポのより大きく、より完全なエキスです:

public class ContractsControlRepository : DataContext, IContractsControlRepository 
    { 
    public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 


public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID) 
{ 
    string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}"; 
    return this.ExecuteQuery<COContractCostCentre>(query, contractID); 
} 

その後ContractsControlRepositoryは私のコントローラ内でインスタンス化し、_contractsControlRepository.ListContractCostCentres(2)のように使用されます。接続は手動では開かず、DataContextはそれを処理します。

+0

これは、リポジトリコードを生成するために使用しているものによって異なります。だから、どのORMソフトウェアを使用していますか? – blowdart

+0

@ Kezzer-私はその本を持っていますが、SteveはLINQ to SQLモデルの属性を(ドラッグアンドドロップとは対照的に)使用していますが、インラインSQLを使用する本のどこにも表示されません。本では、クエリはLINQを使って書かれています。 – RichardOD

+0

私はそれを知っていますが、私たちのシステムの要件は、SQLクエリを生成するためにLINQ to SQLを使用しないことです。LINQ to SQLをORMツールとして使用し、クエリのインラインクエリを使用します。私の上司が私にそう言っているので、私はこれを行う必要があります。私はそれに同意しない、私は彼にLINQ to SQLクエリが直接SQLクエリよりも遅くないことを証明するまで選択肢がない。 – Kezzer

答えて

2

ORMの詳細とSQLデータベースドライバの接続方法を知らないと、接続プールになりません。接続が閉じられると、プールに戻って解放され、X秒間(Xは設定可能)開いたままになります。別の接続が開かれ、すべてのパラメータが一致する場合(サーバー名、アプリケーション名、データベース名、認証の詳細など)、新しい接続を開かずにプール内の空いているオープン接続が再利用されます。

問題の本を読んでいないのですが、実際には「マニュアルlinq」は何か分かりません。手動の場合は、テーブルを自分で取り戻すことを意味します。明らかに、接続を開いたり閉じたりしています。 Linq to SQLは、接続プールが有効になるステートメントが最終的に実行されたときに新しい接続オブジェクトを使用します。つまり、新しい接続オブジェクトは実際の新しい接続ではない可能性があります。

+0

RichardODと私の編集に私のコメントをチェックしてください。私はモデリングには通常のSQLを使用していますが、LINQを使用しています。 – Kezzer

+0

私は「マニュアル」と言います。基本的には、モデリングにLINQを使用していますが、データをクエリするためにSQLクエリを使用しています。私はそれが私が使用していない構文に従うので、LINQをSQLに使用していません。私のORMツールはLINGです。私のクエリツールは、生のSQLクエリでDataContextを使用します。私は接続を開いたり閉じたりしていません。 – Kezzer

+0

私の答えはOKです。 – blowdart