ADO.NET 使用時の注意点

■ DB 接続クローズ漏れがないかの確認

ADO.NET は既定で 100 接続までをプールして使用し、上限に達すると接続時に例外が発生する。 使用していない接続は 30 分程すると自動でクローズされるため、ローカルでデバッグしている時は、クローズ漏れのバグがあってもこの問題が発生する可能性は低い。 下記 クエリ (SQL Server) で DB 側の接続数が確認できるが、操作する度にこの数が増えるようだと、リークが疑われる。

SELECT hostname, count(*)
FROM master..sysprocesses
WHERE hostname != ''
GROUP BY hostname

また、Windows のカウンターログもある。

[SQLServer:General Statistics] - [User Connections]

開発時にリークを見つけやすくするため、接続文字列の MaxPoolSize を 3 ~ 5 ぐらいにセットしておいた方が良いかも (接続プロセス単位の制限になる様子)。 クライアントアプリのようにプロセスがある程度のタイミングで終了する場合はリークが存在しても問題にはなりづらいが、ASP.NET のように同一プロセスから長時間多数の DB 接続を行う場合は、本番時に本問題が表面化しやすい。

参考 URL