2013-04-12 75 views
5

ODP.NETバージョン2.111.6.20を使用して、.NETアプリケーションの接続プーリングを構成しようとしています。データベースはOracle 11.1です。ODP.NET接続プールパラメータ

私は、.NET 2.0のアプリケーションで次の接続文字列を使用しています:

Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=2; Max Pool Size=5; Connection Timeout=30;"

を接続プールは、2つの接続で初期化し、必要に応じて5つの接続までインクリメントすべき文書によります。それは決して5つ以上の接続を得るべきではありません。

私が見ているのは、接続が一度に2つ増え、最大10の接続に成長していることです。 v $ sessionテーブルを照会してOracleデータベース内の接続を監視しているので、アプリケーションからの特定のアプリケーションからの接続であることがわかります。

このアプリケーション内の接続プールで発生している可能性のあるものを特定できれば、誰でも最大接続数を超えている可能性があります。感謝します。ここで

サンプルC#コード

は、データベースへの呼び出しを行うコードのサンプルです:

const string connectionString = "Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=5; Max Pool Size=5; Connection Timeout=30;"; 

using (OracleConnection connection = new OracleConnection(connectionString)) { 
    connection.Open(); 

    using (OracleCommand command = new OracleCommand("ALTER SESSION SET TIME_ZONE='UTC'", connection)) { 
     command.ExecuteScalar(); 
    } 

    using (OracleTransaction transaction = connection.BeginTransaction()) { 
     const string procSql = @"BEGIN P_SERVICES.UPDATE_VERSION(:id, :version, :installDate); END;"; 
     using (OracleCommand command = new OracleCommand(procSql, connection)) { 
      command.Parameters.Add(new OracleParameter("id", OracleDbType.Varchar2) { Value = id }); 
      command.Parameters.Add(new OracleParameter("version", OracleDbType.Varchar2) { Value = version }); 
      command.Parameters.Add(new OracleParameter("installDate", OracleDbType.TimeStamp) { Value = dateUpdated }); 

      try { 
       command.ExecuteNonQuery(); 
      } catch (OracleException oe) { 
       if (Log.IsErrorEnabled) { 
        Log.ErrorFormat("Update Error: {0}", oe.Message); 
       } 

       throw; 
      } 

      transaction.Commit(); 
     } 
    } 
} 
+0

コマンドをどのように実行しているかの例を投稿できますか?あなたが "USING"を使用しているかどうか、または接続/コマンドを手動で作成/破棄しているかどうかを確認すると良いでしょう。 –

+0

コードサンプルの元の投稿への更新を見てください。コードを手動で閉じるのではなく、接続を切断する – jprincipe

+0

My Oracle.DataAccessアセンブリが4.112.3.0であるのは、バージョン2.111.6.20の同じアセンブリですか?もしそうなら、多分それを更新する時間です。 .NET 4以前のバージョンに制限されていない限り、できないのですか? –

答えて

10

最大接続がデータベースに見られている理由は、接続プールの設定で許可される数を超えて増加している私を発見しました接続文字列に

IISでアプリケーションプールが、私が見つけた何1のデフォルトとは異なる設定「ワーカープロセスの最大数は、」データベースで見られる接続の数がMax Pool Size * Number of Worker Processesに育つことができるということです有するように構成しました。 。

私は最大プールサイズを持っているのであれば5のと5 ワーカーはを処理し、その後許可される接続の合計数は25です。だから、各ワーカープロセスは、それが共有されていない接続プールの独自のインスタンスのしているようです他のワーカープロセス間で

+2

また、接続プールはアプリケーションドメインごとのワーカープロセスごとであることに注意してください。最大プールサイズ5 * 5ワーカープロセス* 2各ドメイン= 50接続。 – RolandoCC

3

Tom kyte:
によると、接続が使用するとデータベースの間の物理的な回路です。 。
接続には があります。最も一般的なのは、DEDICATEDサーバーとSHAREDサーバーです。
データベースへの所定の接続で1つ以上のセッションが確立される可能性があります。
セッションがステートメントを実行するためにプロセスが使用されます。
ときどき CONNECTION-> SESSION-> PROCESS(例:通常のサーバー接続である )との間に1対1の関係があります。
時々、 セッションへの接続から1対多のセッションがあります。
共有サーバー(MTS)を使用している場合、SESSIONは オーダーのプロセスプールからプロセスを取得してステートメントを実行します。たとえば、 は特定の接続またはセッション専用である必要はありません。コールが終了すると、プロセスはプロセスプールプール に解放されます。
だから
select username from v$session where username is not null はあなたがJDBCとセッションVS接続に関する有用な本はhere

3

を見つけることができ

select username, program from v$process; 

を使用することができます接続を確認するには、現在のseesions(ない接続に)
が表示されます実行していますこのクエリを使用して、接続数を監視することができます&ステータス。このクエリを使用して、接続文字列の設定が機能していることを確認できました。以下の説明を参照してください。

select COUNT(*) AS Connections 
     ,s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 
from V$process p 
join V$session s on s.paddr = p.addr 
where NOT s.UserName IS NULL 
group by s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 

これは2ページで実行しましたが、これはデータベースの検索を大量に行いました。私はウェブサーバと同じユーザ名を持つ空のモジュールの下に数の変動を見

Max Pool Size = 5

最大プールサイズ=:ここに私の異なる結果があります。私は彼らがウェブサーバーと同様にそのバケツの下になぜ現れたのか分かりません。

最大プールサイズ= 1

Max Pool Size = 1

私はプールのサイズを制限すると、私は今まで、空のモジュールの1つの接続、およびWebサーバのための1つの接続を見ましたが、その後の接続がポップアップDBMS_SCHEDULERの下にあります。これは、残りの残りの部分が保留中であることを示していますか?

これは、最大プールサイズが機能していることを証明していると思いますが、わかりません。

+0

v $ processに関する情報をありがとう。残念ながら、これはちょうど私がv $セッションテーブルで識別したのと同じ数字の内訳を私に与えました。現在は合計20の接続が確立されていますが、最大25の接続を確認しています。v $ processテーブルからの現在の内訳は、INACTIVE、w3wp.exeおよびosuserのステータスの接続ユーザーからの14接続ですネットワーク?サービス。そのユーザーには、OSUSERのNETWORK?SERVICEでINACTIVEではなく、(null)のモジュールが6つあります。 – jprincipe

+0

DBMS_SCHEDULERのいずれかが表示されますか?結果のマスク版を投稿できますか? –

+0

問題のDBユーザーに対してDBMS_SCHEDULERに関連するものは表示されません。すべての接続はw3wp.exeまたは(null)から行われます。 – jprincipe

2

この問題を解決する必要があり、パフォーマンスカウンターで&が汚れている場合は、このブログの記事を参考にしてください。少なくとも、Oracleが報告している接続の数とプールされていない接続の数がプールされているかどうかの区別を狭めるのに役立つかもしれません。

http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/

彼らは特に有用であろうように、これらのカウンタは思え:

NumberOfActiveConnectionPools 
NumberOfActiveConnections 
NumberOfFreeConnections 
NumberOfInactiveConnectionPools 
NumberOfNonPooledConnections 
NumberOfPooledConnections 
NumberOfReclaimedConnections 
NumberOfStasisConnections