2

私が行ったいくつかの.NETC#Webサービスプロジェクトでは、シングルトンパターンを使用してdbへのアクセスを静的にしました。それから先日、私の友人はこれは悪いことだと私に言いました。同じdbエンティティに対して多くの要求が行われると、静的インスタンスのためにdbがロックされるからです。私の友達の仮定は正しいですか?新しいリクエストごとにクラスの新しいインスタンスが作成されると思いましたか?

シングルトンクラスの実装は次のようになります。

public class WebService
{
    private readonly IFactory _factory;

    public WebService(IFactory factory)
    {
        _factory = factory;
    }

    public IDataRepository Data
    {
        get
        {
            return _factory.GetDatabase();    
        }            
    }
}

public static class WebServiceImpl
{
    private static readonly WebService _webService = new WebShop(new WebserviceFactoryImpl());

    public static WebService webService { get { return _webService; } }

}

_factory.GetDatabase()は、Databaseクラスの新しいインスタンスを返します。

4

1 に答える 1

2

を見るとWebServiceImpl、すべての呼び出しが単一のWebServiceインスタンスを共有しています。さて、それがどのように実装されているかに応じて、これは必ずしも問題ではありません。たとえば、_factory.GetDatabase();リクエストごとに呼び出されることになった場合は、それを回避している可能性があります。さらに何をするかに応じGetDatabase()て-つまり、呼び出しごとに新しいインスタンスを取得しますか?それとも毎回同じインスタンスを提供しますか?簡単に言うと、完全に答えるのに十分な情報がありません。だが:

  • リクエスト間で単一のデータベース接続を共有することは危険です。ロック/同期する必要があるか、多くのエラーのリスクがあります(データベース接続は通常スレッドセーフになるように記述されていません)
  • リクエスト間でORMを共有することはさらに悪いことです。上記のすべてに加えて、ID/オブジェクトキャッシュにデータが蓄積するという問題も発生します。ORMインスタンス(データコンテキストなど)は、短命であり、その後破棄される(場合によっては破棄される)ことを目的としています。

データベースへの静的アクセスは必ずしも問題ではありません。それはすべて、それがどのように実装されるかにかかっています。たとえば、静的ベースのAPIは、すべての呼び出しで接続を作成(および破棄)することができます。

于 2013-03-09T19:55:30.630 に答える