C#静的データベースクラス?
-
10-07-2019 - |
質問
次のメソッドを含むDatabaseクラスがあります:
- public bool ExecuteUDIQuery(string query)// UDI =更新削除挿入
- public bool ExecuteSelectQuery(string query)
- public bool ExecuteSP(string sp、string [、] parms)
- public int ExecuteSPReturnValue(string sp、string [、] parms)
メソッドの結果は、プライベートデータセットまたはデータテーブルに保存されます。これらのオブジェクトはゲッターとして定義されています。
Databaseクラスを使用するクラスは約10個あります。すべてのクラスは、データベースデータベースのオブジェクトを作成します。今、Databaseクラスを静的にすることを考えていました。これはいいアイデアですか?もしそうなら、なぜですか?ではないのはなぜですか?
解決
理解すれば、データベースクラスにはクエリの結果を格納するプロパティがいくつかありますか?その場合、スレッドセーフではないため、静的にすることはできません。クエリの結果がこれらのプロパティに保存されている場合、最初のクエリの直後に2番目のクエリが実行されるとどうなりますか?同じ静的変数に格納されます。 Webアプリケーションについても同じことが言えます。別のユーザーがサイトを閲覧した結果、最初のユーザーの結果が変わります。
編集:要約すると、クエリの結果を静的変数に保存するとき、特にWebサイトでクラスが使用されるときは、プロパティ値がWebサイトのすべての訪問者の間で共有されるため、クラスを静的にしないでください。 20人の訪問者が同時にクエリを実行すると、訪問者1は訪問者20のクエリの結果を表示します。
他のヒント
特定の例では、クラスを静的にすることをお勧めします。Databaseクラスの状態を維持し、クラスを静的にすることで、データベースを使用するすべてのクラス間で状態が共有されます。現在の設定では、各データベースインスタンスは独自の状態を保持するため、データベース呼び出しが互いに干渉する問題はありません。
メソッド呼び出しの実行時にデータセットを返すようにDatabaseクラスをリファクタリングする場合、静的にすることは問題ありません。Databaseクラスにはステートフル情報が残っていません。
しかし、そうではないため:いいえ、クラスを静的にしないでください。
スレッドの安全性に関する他のコメントに加えて、並列化の問題もあります。あなたの場合、データベースへの複数の接続を同時に開くことができず、結果のスレッドセーフが問題ではない場合でも、複数の並列クエリを実行することはできません。
だから私は他の人に同意します、それから静的クラスを作らないでください。
クラスを静的にするのは便利かもしれませんが、その新しいインスタンスを作成することはおそらく高価な操作ではないので、おそらくパフォーマンス面で多くを獲得することはあまりありません。
編集:
コメントで、Webサイトでクラスを使用したいことを見ました。その場合、本当にこれを行うべきではありません。静的データベースクラスを使用すると、いつでも安全にリクエストを1つだけ処理できますが、それはあなたが望むものではありません。
使用しているデータベースまたはORMの種類によって異なります。しかし、私の経験では、それは良いアイデアのように思えましたが、結局私を刺激しました。 LINQ-to-SQLで私が行った方法は次のとおりです。
データコンテキストへの静的変数を持つリポジトリクラスがありました。最初は機能していましたが、さらに多くのリポジトリクラスを作成する必要が生じたときに、ハッキングを行うとバグが発生しました。 LINQ-to-SQLのデータコンテキストはすべての結果をキャッシュし、それらを更新する方法はありません。したがって、あるコンテキストのテーブルに投稿を追加した場合、そのテーブルをキャッシュした他の投稿には表示されません。解決策は、静的修飾子を削除し、リポジトリにコンストラクターでコンテキストを作成させることでした。リポジトリクラスは使用時に作成されたため、新しいデータコンテキストも作成されます。
静的変数はメモリ内のフットプリントを少なくすると主張できますが、データコンテキストのフットプリントは最初は非常に小さく、最後にガベージコレクションされます。
回答投稿に反して。 静的なデータベースアクセスを使用してWebフレームワークを構築しました。これは非常に機能し、優れたパフォーマンスを提供します。
http://www.codeplex.com/Cubes でソースコードを確認できます。
DBに対してクエリを実行するだけの場合は、yesで静的にします。このオブジェクトが何らかの状態を保持する必要がある場合にのみ、インスタンスを作成する必要があります。
静的メソッドがある場合、データベースを開いたり閉じたりするときにインスタンスを追跡する必要があります。
したがって、おそらくあなたがしたいことは、インスタンスまたは現在のインスタンスと呼ばれる静的メソッドを持っていることです。そして、db-classの新しいインスタンスを作成して、静的メソッドで返します。
静的な使用に適したメソッド。今のところ、静的メソッドに変換するのに問題はないと思います。
しかし、後でトランザクションを管理する必要があるかもしれません。トランザクション管理をクラスに任せることで、時間を大幅に節約できます。このシナリオは、非静的クラスに最適です。