2

私はLinqtosqlを初めて使用します。そして、私の質問は単純です。

シングルトンとして機能するDALのパブリック静的メンバーとしてDataContextを使用することをお勧めしますか?

4

5 に答える 5

3

シングルトンのままにしておくのはあまり良い考えDataContextではありません。小さなアプリケーションの場合、何の影響も見られないかもしれませんが、アクセスするユーザーが多いWebアプリケーションの場合、メモリリークが発生します。なんで?

DataContext基本的に、エンティティの変更を追跡し、1つのビジネストランザクションでデータベースへのラウンドトリップを回避するために内部キャッシュを内部に持つUnitOfWorkをバックグラウンドで実装します。静的な状態を長期間維持すると、内部キャッシュが当面増加し、適切に解放されないことを意味します。DataContext

DataContext1つのビジネストランザクションに保持し、できるだけ早くリリースする必要があります。Webアプリケーションのベストプラクティスは、DataContext要求に従って保持することです。IoC Containerを利用することもできますが、ほとんどのIoCContainerはこれをサポートしています。

于 2012-10-09T10:09:23.097 に答える
2

また、DALで共有データコンテキストを使用しているときに1つのことを経験しました。2人のユーザーAとBがいるとします。ユーザーAが開始してトランザクションを実行すると、ユーザーBはユーザーAによって行われた変更をコミットできます。これは、静的DataContextを使用することの副作用です。

于 2012-10-19T14:13:21.073 に答える
1

私は通常、データアクセスクラスの機能をグループ化して、そのクラスをIDisposableにするようにしています。次に、コンストラクターでDataContextを作成し、disposeメソッドでDataContextに対して.dispose()呼び出しを実行します。

したがって、そのクラスから何かが必要な場合は、それをusingステートメントでラップし、すべて同じDataContextを使用して一連の呼び出しを行うことができます。

これは、静的DataContextを使用する場合とほとんど同じ効果ですが、接続を閉じることを忘れないことを意味し、静的にするよりも少しOOのように見えます。

    public class MyDataAccessClass: IDisposable
    {
      private readonly DbDataContext _dbContext;

      public MyDataAccessClass()
      {
          _dbContext = new DbDataContext ();
      }

      public void Dispose()
      {
        _dbContext.Dispose();
      }

      public List<CoolData> GetStuff()
      {
           var d = _dbContext.CallStuff();
           return d;
      }
    }

それからあなたのクラスで

   using(var d = new MyDataAccessClass())
   {
         //Make lots of calls to different methods of d here and you'll reuse your DataContext
   }
于 2012-10-09T10:10:31.453 に答える
1

「作業単位」のパターンについて読むことをお勧めします。つまり、 http: //stuartharris4.blogspot.com/2008/06/working-together-linq-to-sql.html

于 2012-10-09T10:02:05.017 に答える
1

DataContextASP.NETなどのマルチスレッドアプリケーションで は、間違いなく静的なものを使用しないでください。DataContextのMSDNドキュメントには、次のように記載されています。

インスタンスメンバーは、スレッドセーフであることが保証されていません。

于 2012-10-09T10:14:34.510 に答える