このページにアクセスする必要がある将来のグーグルのために、ここに私たちが抱えていた問題があります。プロトコル違反の例外は、アプリケーションログとOracleトレースに記録されていました。
Oracleトレース
これは、Oracleトレースファイルからのエラーです
---プロトコル違反が検出されました---
----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
select xyz
アプリケーションログから
Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];
症状
この例外は時折発生していました。スタックトレースには異なるSQLが含まれており、非常に混乱していました。 sqlplusを使用してSQLを実行すると正常に機能しました。
根本原因
OracleドライバがCLOBデータをエクスポートしようとしたときに例外がスローされました。これは、すべてではなく、少数のレコードで発生していました。データ自体はファイルでした。視覚的には、そのデータの何が問題であるかを理解できませんでした。
Oracleログにエラーが表示されたのはなぜですか?
では、これがドライバーの欠陥である場合、なぜOracleトレースにエラーが表示されたのでしょうか。論理的には、ドライバーエラーはアプリケーションログに限定する必要があります。その理由は、プロトコル違反が発生したときに接続が破損したためです。この接続は接続プールに戻されました。その接続を使用するユーザーまたはジョブは機能せず、エラーが発生します。そのため、ランダムな場所で、ランダムなユーザーが発生します。
解決策
短期的な修正は、接続プールのこのプロパティを変更することでした。 DBCP接続プールを使用しています。
fromds.setTestOnBorrow(false); tods.setTestOnBorrow(true);
に変更これで、プールが破損した接続をプールに返すと、アプリがこの接続を借用する前に、有効性をテストします。接続が使用できない場合、プールは破棄され、アプリは新しい/有効な接続を取得します。
接続プールログを有効にすると、通常は飲み込まれる例外が表示されます。
ドライバーのアップグレード
OJDBC12.1.0.1からOJDBC12.1.0.2にアップグレードすると、問題のある行であっても問題が解決しました。
参考のための他のいくつかのリンク
https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used