1

ado.net を使用する場合、あまりにも多くの接続を開いたり閉じたりすることを心配する必要がありますか?

たとえば、必要なすべてのオブジェクトを満たすために 3 つの個別のリポジトリを呼び出す MVC コントローラー メソッドがあるとします。

 public ActionResult()
 {
      var codesRepository = new CodesRepository();
      viewModel.codes = codesRepository.GetCodesByName("D");

      var employeeRepository = new EmployeeRepository();
      viewModel.employees = employeeRepository.GetByName("Thomas");

      var companyRepository = new CompanyRepository();
      viewModel.company = companyRepository.GetById(20);

      //.... rest of code
 }

上記の各 GetBy メソッドで、接続を開いたり閉じたりしています。

using(var connection = DbFactory.GetConnection('SQLBase') 
{
    // code to fill the objects.
}

呼び出されたメソッドごとに接続を開いて破棄しているというこのアプローチについて心配する必要はありますか? 3つすべてに同じ接続を使用する必要があるように思えますか?

接続プーリングについて少し読んだことがあります。それはデータベース固有の機能ですか、それとも ado.net の機能ですか?

4

2 に答える 2

1

はい、そうする必要があります-主にあなたのデザインがアンチパターンだからです。読み取りでのパフォーマンスへの影響は少ないですが、トランザクションの整合性または書き込み/更新側のパフォーマンスのいずれかを完全に破壊します。

重要なのは、複数のリポジトリ間で更新を行うには、DTC(低速)か、トランザクションの整合性がないリポジトリごとにリポジトリを作成する必要があります。

また、エンティティを相互参照する選択操作では、Yoは非常に遅くなります。そして、あなたはメンテナンスの悪夢を抱えています。

companyRepository.GetById(20);

する必要があります

repository.Element<Company>.Where (x => x.id=20);

このアプローチにより、次のことが可能になります。

  • すべてに1つのリポジトリを使用します。
  • 参加操作と副選択を含む、会社の柔軟性を使用する
  • DTCを使用しないトランザクションのすべての更新には、1つの接続で1つのリポジトリを使用します。

今のところ、あなたの問題はオープニングではなく、アップデートとトランザクションです。

これは、Entity Frameworkなどで使用されるアプローチです。パフォーマンスが必要な場合は、BlToolkitを使用できます。

于 2012-12-10T04:30:24.180 に答える
-1

ADO.NET は接続プールを自動的に使用するため、心配する必要はありません。

したがって、データベースへの複数の接続を開くと、それらを 1 つの接続にプールすることで接続が最適化されます。

基本的には気にする必要はありません:)

于 2012-12-10T04:04:15.173 に答える