2

asp.netアプリで次のコードを使用しています。このコードによると、アプリのすべてのユーザーに対して、DBProviderFactoryのインスタンスは1つだけになります。これにより、マルチユーザー環境で問題が発生しますか?したがって、すべてのユーザーは同じDbProviderFactoryオブジェクトを使用して接続を作成します。これがマルチユーザー環境である種の隠れた問題を引き起こすかどうかはわかりません。

DbProviderFactoryの静的インスタンスを使用している理由は、接続をインスタンス化する必要があるたびにGetFactoryメソッドが呼び出されないようにするためです。これにより、接続オブジェクトをすばやく取得できるようになると思います。私の推論に何か欠陥はありますか?

 public class DatabaseAccess
{

    private static readonly DbProviderFactory _dbProviderFactory =
 DbProviderFactories.GetFactory(System.Configuration.ConfigurationManager.ConnectionStrings["DB"].ProviderName);

    public static DbConnection GetDbConnection()
    {
        DbConnection con = _dbProviderFactory.CreateConnection(); 
        con.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DB"].ConnectionString;
        return con;
    }
}
4

1 に答える 1

1

見た目は問題ありませんが、おそらく興味深い効率は得られません。

.NETでのオブジェクト作成は迅速です。したがって、ファクトリの作成にはそれほど時間はかかりません。リモートデータベースから接続を取得することはできますが、接続プールを使用すると、通常、これは問題になりません。

工場はおそらくそれ自身の状態を実装していないようであり、おそらく不変であるように見えます。したがって、異なるスレッドからのアクセスはおそらく問題ありません。

静的オブジェクトはガベージコレクションされません。工場の規模が大きくなるとは思えないので、問題ないはずです。

したがって、大量の安価なオブジェクト作成、大量の安価なバックグラウンドガベージコレクションを回避し、GetFactoryによって返される正確な実装に応じて、派生クラスが実際に状態を持ち、スレッドセーフではないという小さなリスクがあります。

于 2014-03-22T00:55:45.283 に答える