2

自宅のサーバー (RAM が 1 GB の Atom プロセッサ) に SQL サーバーがあり、それを使用して 1 つまたは 2 つのアプリケーションのデータを保存しています。プログラムの開始時に DataContext オブジェクトを作成し、アプリの全期間にわたってそれを保持するか、必要な場合にのみ接続を作成する必要があるかどうか疑問に思っていました。アプリケーションが突然停止した場合はどうなりますか? 接続はクリーンアップされますか?

4

3 に答える 3

2

DataContext オブジェクトに既に開いている SqlConnection を渡さない限り、DataContext はデータベース操作の完了後にデータベース接続を自動的に閉じます。したがって、接続を開いたままにすることはできません。これは、Reflector の DataContext クラスを見るか、ASP.NET MVC のヒント #34: DataContext を破棄する (またはしないでください)ブログ投稿を読むことで確認できます。そのため、DataContext オブジェクトが存続している場合でも、開いているデータベース接続が存在することはありません。

データベース接続を DataContext の外部で処理し、それを開いたままにしている場合は、これを行うべきではありません。一般に、DataContext オブジェクトを含め、必要なときに必要な場所でリソースを作成して使用する必要があります。データベース接続を必要とせずに開いたままにしておく必要はありません。接続を閉じて、別のデータベース接続要求を処理するために解放されてプールに戻されるようにします。前述したように、DataContext にデータベース接続を処理させる場合、データベース接続に関する限り、特別なことを行う必要はありません。

アプリケーションが突然クラッシュして終了した場合でも、開いているデータベース接続やアプリケーション ドメインに関連付けられている基礎となる接続プールなど、すべてが停止するため、問題ありません。

于 2009-09-02T00:27:00.027 に答える
1

必要なときにデータ コンテキストを表示し、完了したら削除します。
1 つのグローバルなデータコンテキストを持つということは、それを必要とするすべてのものにそれを渡す必要があることを意味します。(データベースへのアクセスが必要なすべてのメソッドには、その署名に追加のパラメーターがあります)。

アプリの 1 つをマルチスレッド化することにした場合、単一のグローバル データ コンテキストを持つことも苦痛になります。

于 2009-09-01T23:35:20.387 に答える
0

.NET での SQL 接続プールを見たことがありますか? http://msdn.microsoft.com/en-us/library/8xx3tyca%28VS.80%29.aspxの記事をご覧ください。接続プーリングはすべてのダーティな作業を処理し、プログラムでエラーが発生した場合は自動的にクリーンアップします。接続を再利用するのは非常に効率的であるため、接続を再利用する際のオーバーヘッドはほとんどありません (プログラムの開始時に最初の接続を作成するコストは同じです)。小さなアプリケーションではやり過ぎかもしれませんが、大規模なプロジェクトではおそらく良い習慣です。

于 2009-09-01T23:35:45.657 に答える