ダイレクトモードでのパラメータ化されたクエリでいくつかの奇妙な問題が発生しています。
基本的に、すでに一意の行が含まれているテーブルで挿入を実行すると、予期される挿入例外が発生します。挿入例外の後、私はこれと同じ接続を使用して、データがすでにロックダウンされている情報を取得し、ユーザーを報告します(この時点では接続はまだ良好です)。その後、この接続は閉じられ、プールに戻されます。これは、予想どおり、この時点まではすべて問題ありません。
後でこの接続がプールから取得されたときに、単純な更新パラメーター化照会を実行しようとすると、次の例外が発生します。ORA-01008:すべての変数がバインドされていません。これは、すべての変数がバインドされていないかどうかを確認するのに意味がありますが、OracleParameterコレクションを見ると、すべてのパラメーターが存在し、それらの値が正しいことがはっきりとわかります。言うまでもなく、このクエリは、クライアントリクエストごとに更新される一般的な更新テーブルであるため、この接続がプール内の他の接続のためにプールから取得される前に複数回実行されます。さらに、このコードはすべて、Oracleクライアントを使用してダイレクトモードをオフにすると正常に機能します(ダイレクトモードとまったく同じコードとクエリの実行)。
基本的に、直接モードで挿入が実行されて失敗し、接続が閉じられてプールに戻されると、何らかの理由で接続が破損し、パラメーター化されたクエリで再度使用すると失敗するようです。
唯一の問題は、この問題が単純なケースで確実に再現できないことであるということを除いて、単純なサンプルを作成します。
情報:
- これはクライアントサーバーアプリです。単一のクライアントでも問題が発生します。
- 接続は、クライアント要求ごとに作成されてプールから取得され、要求の実行後に閉じられます。
- 各接続は単一のスレッド内で使用されます(複数のスレッド間では使用されません)
- 最新のDevart.Data.Oracle5.35.54とDevart.Data5.0.16を使用して、以前のバージョンでも同じ結果を試しました。
誰かがこれに出くわしたか、何かアイデアを持っているなら、あなたの助けは大いに感謝されます
ありがとう