Oracle から Oracle 12 データベース (非 RAC) 構成への最新の Official ODP.NET Managed (発行: 2015-10-14 | バージョン: 12.1.2400) を使用していますが、データベース接続を通常より長く維持することができません。 < 3 分。
接続文字列は次を指定します。
MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;
私たちも試しました
CONNECTION LIFETIME=90000;MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;
サーバーで PerfMon を使用し、HardConnects/HardDisconnects のカウンターを監視すると、接続プールが閉じられ、3 分ごとに 5 つの接続が再開されることがわかりますが、これは予期したものではありません。
この動作は、DataAccess に EF6 を使用する Web アプリと、ORM を持たないアプリ (単純な古い SQL) の両方で発生します。
Oracleドキュメントによると:
接続プーリング サービスは、使用されていない接続を閉じます。接続は 3 分ごとに閉じられます。ConnectionString プロパティの Decr Pool Size 属性は、3 分ごとに閉じることができる最大数の接続に対して接続プール サービスを提供します。
私にとって - 接続が有効期限内にある限り、ConnectionPool には 3 分よりもはるかに長い有効な接続の MIN POOL SIZE が存在するはずです。
Devart の Oracle ドライバーを使用する別のアプリがあり、このドライバーは、長時間存続するプールされた接続を保持します。
ODP.NET Managed Driver の ConnectionPool のこの「誤動作」を見て、解決策を見つけた人はいますか? それとも、これは ODP.NET Managed の ConnectionPool のバグでしょうか?
更新 2016.01.27:
問題を示すために、github アカウントにデモ アプリを追加しました。
https://github.com/jonnybee/OraConnTest
これは、接続文字列を追加し、ボタンをクリックして、3 秒ごとに「SELECT 'OK' FROM DUAL」を実行するバックグラウンド ワーカーを開始する小さな winforms アプリです。
私の接続文字列には、POOLING=True;MAX POOL SIZE=10;DECR POOL SIZE=1;CONNECTION LIFETIME=86400;INCR POOL SIZE=1;MIN POOL SIZE=5 + USER ID、PASSWORD、および DATA SOURCE を追加する必要があります。
3 分ごとに、5 つの既存の接続が閉じられ、5 つの新しい接続 (MIN POOL SIZE 設定) が作成されることがわかります。
この SQL を実行して、実際の接続を確認します。select sid, logon_time, prev_exec_start, wait_time_micro/1000 from v$session where program like '%OraWinApp%' order by logon_time desc
プログラムと perfmon の実行中に、古い接続が閉じられ、新しい login_time で新しい接続が作成されるときに、この動作が見られます。