問題タブ [odp.net-managed]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oracle - ODP.NET Managed ConnectionPool は 3 分ごとに閉じたり開いたりします
Oracle から Oracle 12 データベース (非 RAC) 構成への最新の Official ODP.NET Managed (発行: 2015-10-14 | バージョン: 12.1.2400) を使用していますが、データベース接続を通常より長く維持することができません。 < 3 分。
接続文字列は次を指定します。
私たちも試しました
サーバーで 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 で新しい接続が作成されるときに、この動作が見られます。
.net - LDAP.ORAが含まれていないと、ODP.NETマネージド・データ・アクセスのLDAP構成が機能しない
何らかの理由で、LDAP を使用して Oracle に接続しようとするときに、.NET プロジェクト内に LDAP.ORA ファイルを含める必要があります。Oracle.ManagagedDataAccess nuget パッケージの使用に関する私の理解から、web.config 内にすべてを含めることができるはずです。 Oracle のドキュメントはここにあり、便利なウォークスルーはここにあります。構成プロパティの 1 つがわずかにずれていると推測していますが、追跡できていません。どんな助けでも大歓迎です!
Oracle 構成セクション
Oracle 接続文字列
接続コード
odp.net-managed - ORA-12570: ネットワーク・セッション - 20分間の実行後
ネットワーク セッション エラーが発生しています。
"ORA-12570: ネットワーク セッション: 予期しないパケット読み取りエラー".
これは、クエリを 20 ~ 21 分実行した後に発生します。単一のクエリまたは複数のクエリを実行すると、常にこのエラーがスローされます。
20 分までは正常に動作し、ログはすべて正常に表示されます。prod ログ レコードを取得してマスター csv ファイルに保存します。ログ レコードは数百万にのぼり、取得に多くの時間がかかります。先月まで正常に動作していました。
- 最新のODP.net「Oracle.ManagedDataAccess.12.1.24160419」をナゲットで取得しました。
- さまざまなプーリング オプションを試しました。プーリングオフも役に立ちませんでした。
エラーを解決するにはどうすればよいですか。助けてくれてありがとう。
oracle - ODP.net - ストアド プロシージャの呼び出し時に ORA-12537 End of File エラーが発生する
私は、新しい Oracle インストールでパッケージ内のストアド プロシージャを実行するたびに、断続的に発生し続ける上記に困惑しています。
sproc は WCF から呼び出され、次の例外を返します。
それにもパターンはないようです。
これが私が試したものです:
- GAC をチェックして、複数のバージョンの ODP が存在しないことを確認しました。マネージド データ アクセス コンポーネントが nuget からインポートされました - バージョンは 12.1.2400 です。
- ソートする接続文字列にさまざまな属性を追加しました。つまり、persist security info=True;Self Tuning=True;Min Pool Size=3;Max Pool Size=25;Incr Pool Size=3;Decr Pool Size=1;Connection Timeout=20 です。 ;プーリング=false;接続ライフタイム=59; -さまざまな構成を試しましたが、うまくいきませんでした。たとえば、Pooling を false/true に設定するなどです。
汎用コードでのオブジェクトの確実な破棄。現在使用されているテストコードは次のとおりです。
/li>ストアド プロシージャ内のクエリを「固定」値に切り詰めて、sproc 内に問題の原因がないことを確認します。以下に説明するいくつかの興味深い問題を見つけました。
だから、私は途方に暮れています。ODP トレースを有効にしましたが、プールを処理する際に問題が発生しているように見えました。初めて、私はこれを得ました:
トレースを 127 に上げて、次のようになりました。
selectステートメントとwhere句をコメントアウトしてsprocのクエリを微調整し、徐々にそれらを元に戻して、問題がクエリであるかどうかを確認しました(ただし、Oracle Developerで実行しても問題ありません)。このステートメントに絞り込みました-再導入すると、ファイルの終わりの例外が再び発生します。
パッケージ内の ISNUMERIC 関数は次のようになります。
最初は、キャッチされた例外の数が原因でそれ以上の実行が妨げられているのではないかと考えました。ただし、関数を単純化して「1」を返すだけにしましたが、それでも毎回機能しませんでした。
クエリの結果は、ref カーソルを介して返されます。
最後に、select ステートメントと where 句からすべての関数呼び出しを削除しました。これにより、エラーの発生が即座に停止しました。それらを、関数が実行するのと同じロジックに置き換えました。
どうしたの?関数の呼び出しを含むパッケージ内で sprocs を実行する場合、ODP.net に制限はありますか? 少し奇妙に思えます。
回避策は関数を使用しないことですが、一部の select ステートメントには、Union ベースのクエリで同じロジックを繰り返す条件式が含まれているため、そうしたくありません。
どんな助けや指針も大歓迎です!
Ps。透明性のために、私は先週 Oracle フォーラムにこれを投稿しましたが、応答はありませんでした。
更新 : 2016 年 8 月 3 日
最後に、サーバーにアクセスして、少しトレースを試すことができました。プロセスが途中で終了したときにトレース ログに記録された内容は次のとおりです。
同じフォルダーにコア ダンプも表示されます。そこにあるバケット トレース ファイルを grep して、明白な何かがあるかどうかを確認してみました。
関数を使用するたびに、以前に sprocs を実行しようとしたときの大量のコア ダンプを確認できます。したがって、少なくとも妥当な一貫性があります。
c# - C#: ストアド プロシージャと ODP.NET を使用して BLOB を更新中にエラー ORA-06550 が発生する
ORA-06550: 行 1、列 7: PLS-00306: 'UPDATEPHOTO' の呼び出しで引数の数または型が間違っています
ORA-06550: 行 1、列 7: PL/SQL: ステートメントは無視されましたOracle.ManagedDataAccess.Client.OracleException
手順またはコードのどちらが悪いのかわかりません。
ここに私のストアドプロシージャがあります
ここに私のC#コードがあります:
c# - C# ODB.NET Out パラメータは常に DBNull です
Oracle SQL Server のパッケージ内にストアド プロシージャがあります。このプロシージャには、入力パラメータと出力パラメータがあります。プロシージャ自体は機能し、Oracle SQL Developer で実行すると、出力パラメータは期待される出力 (最後の行の列値) を読み取ります。このプロシージャは、ODP.NET (Oracle Managed Data Access) を介して Web API によって呼び出される必要があります。
問題: 出力パラメーター (ODP では Long 型、db では NUMBER(12,0) 型) が返されません。コマンドの実行後、出力パラメータは常に DBNull です。
以下は、私のコードの関連部分です (他のパラメーターは省略されています): パッケージ プロシージャ:
使用されるパラメーター:
C# の呼び出しコード:
ご覧のとおり、DBNull 値をチェックする方法は知っていますが、それは問題ではありません。DBNull 値を取得することは想定されていません。
これまでに試したいくつかのこと:
- パラメータ DBType を Int64 などに変更します (他のパラメータでは、パラメータ タイプに関するエラーが正しく表示されます)。
- 値でハードコードされた event_id を設定します (event_id := 1234567;)
- SELECT MAX(... クエリをプロシージャの外でデータベース内で直接実行します。
SQL Developerで試したことはすべて期待どおりに機能します。問題があるのは、呼び出し元の C# API への Output パラメーターの転送です。私はたくさんグーグルで検索し、Stackoverflowも検索したので、誰かがうまくいく答えを手伝ってくれることを願っています.