恥を記録する記事。
Visual Studioに限らず、多くのプログラム環境でSQLデータベースに接続するときは、
- まずデータベースサーバーとの接続を確立し、そのハンドルを記録しておく
- そのハンドルを使ってSQLをサーバーに投げ、データを操作する
となると思います。サーバーとの接続およびハンドルの管理を受け持つのが、COM(Visual Studio 6)ではADODB.Connectionクラスであり、.NET(Visual Studio .NET)ではSystem.Data.SqlClient.SqlConnectionクラスになります。
COM/PHP/Perlを使う限りでは、プログラムの最初に接続を確立し、特別に理由がない限りはプログラム終了までそのときのハンドルを使いまわすのが常でした。理由はサーバーへの接続と言う処理はサーバー・クライアント共に比較的重い処理でして、そう何度もやるべきものじゃないからです。
ところが.NETでは逆で同じ接続を長時間使うべきではなく、ひとまとまりの処理が終わったらさっさと接続を切ると言うのが正しい作法とのこと。接続プールという仕組みがあるため、何度も接続と切断を繰り返してもCOMの時のような負担はないらしい。
実際プログラム開始時に作製したSqlConnectionインスタンスを使いまわしていたら、知らない間に接続が切れてしまって、
- SqlClient.InitializeLifetimeService().InitialLeaseTime = TimeSpan.Zero → 無視される
- SqlClientのInitializeLifetimeServiceをオーバーロード → SqlClientは継承不可
と二日間散々悩み、下の参考文書を読んで椅子から転げ落ちそうになったやつがいるようです。お気をつけください。
[参考]毎回SqlConnectionのインスタンスを作成&接続することに関して (Insider.NET)
Comments