sql >> データベース >  >> RDS >> Oracle

SQLException:プロトコル違反。 OracleJDBCDriverの問題

    このページにアクセスする必要がある将来のグーグルのために、ここに私たちが抱えていた問題があります。プロトコル違反の例外は、アプリケーションログと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



    1. Oracleデータベースとは何ですか?

    2. SQLiteの4つの表形式の出力モード

    3. ORDERBYを使用するとクエリが遅くなる

    4. LINQで全文検索(FTS)を使用することは可能ですか?