5

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 で新しい接続が作成されるときに、この動作が見られます。

4

2 に答える 2

1

それがどのように機能するかについてのあなたの評価には同意しますが、ODP.net の接続プーリングは少し奇妙です。ここで重要なのは、接続の有効期間が「アプリケーションが接続を閉じたとき」にのみ遵守されることです。この場合、decr プール サイズには独自のスレッドがあるようです。なぜ彼らがそれをしたのかわかりません-プールを返すときにのみ検証すると、デッド接続(ファイアウォールのタイムアウトによって終了)をプールから引き出すことができるシナリオが作成されます。

私は実際に最小プールサイズを 0 に設定しました。これにより、アプリがアイドル状態のときにプールが空になります。非常に低速なネットワークを使用している場合や、すでに Oracle インスタンスが過負荷になっている場合を除き、違いに気付かないことはほぼ保証できます。接続プーリングは重要ですが、通常、接続はわずか数ミリ秒で確立できます。

ここで私を悩ませているのは、5 つの接続がすべて閉じられていることだけです。decr プール サイズのデフォルトは 1 です。

于 2016-01-26T16:30:42.507 に答える