「プロトコル違反」が発生しています。 RedHat Linux上で実行されているアプリケーションがあります。データベースとアプリケーションはマシン上に共存しています。
使用されているOracleバージョン:Oracle 11g R2(11.2.0.3.0)
使用したJDBCドライバー:12.1.0.1
使用されているJava:jdk1.7.0.65 32ビット
このエラーがドライバーの問題であると指摘されている多くのフォーラムに出くわしましたが、それらすべてのフォーラムで使用されているOracleのバージョンはより高く、ドライバーのバージョンは古く、ドライバーを変更すると問題が解決しました。は低くなりますが、ドライバーのバージョンは高くなります。この場合、ドライバーのバージョンの高い方が問題になる可能性がありますか?
また、このプロトコル違反は、DBの最大接続数に達したときにも発生する可能性があります。
エラーメッセージ:
Java.sql.SQLException:プロトコル違反:[72] at Oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.Java:464)at Oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.Java:192)at Oracle.jdbc Oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.Java:207)at Oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedState.Java:207。at.driver.T4C8Oall.doOALL(T4C8Oall.Java:531) OracleでのOracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.Java:1289)でのOracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.Java:3584)でのjdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.Java:1167) Oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.Java:1493)の.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.Java:3628)
このようなエラーは、JDBCシンドライバーのバグであり、サーバーが回線(ソケット)で何を返しているのかを理解できません。
バグが解決されることを期待して、いつでも最新のJDBCシンドライバーを使用することができます。今日の最新版は12.1.1.2です。
それでも問題が解決しない場合は、Oracleサポートに連絡する必要があります。最初に要求されるのは、このエラーが発生した接続のsqlnetトレースを提供することです。これにより、Oracleエンジニアは、障害が発生したときにネットワークで何が起こっていたかを理解できます。
Sqlnetトレースをオンにするには、サーバー上のsqlnet.oraファイルを編集して追加します
TRACE_LEVEL_SERVER = 16
これにより、(サーバー上の)Trace Directorの接続ごとにトレースファイルが追加されます。これはシステムを劇的に遅くし、大量のトレースを生成するので、運用システムではこれを行わないでください。
幸運を。
ヒープ領域を増やしてください!
この正確なエラーがランダムに表示されました。
アプリケーションがメモリ不足になり、コードのロジックが原因でOutOfMemoryエラーが失われ、無関係な例外がスローされました。
アプリケーションがスロー可能オブジェクトとエラーを処理してはならない理由の1つ。
私の場合、PreparedStatementのgetGeneratedKeys()を使用して現在のシーケンス値を取得すると、プロトコル違反例外が発生しました。次のようにして、シーケンスから現在の値を取得します。
String curSeqValQuery = "SELECT seq_name.CURRVAL FROM DUAL";
...
statement = con.prepareStatement(curSeqValQuery);
resultSet = (OracleResultSet) statement.executeQuery();
...
問題を解決しました。
これは通常、tcp/ipトラフィックの破損を示しています。これは、注入されたトラフィックまたはドロップされたパケットが原因である可能性があります。 ifconfig
を実行して、ネットワークインターフェースのいずれかが異常に大量のドロップされたパケットの影響を受けているかどうかを確認します。問題を回避するには、データベースとJavaプログラムが同じマシンで実行されていることを示すため、外部IPではなくループバックインターフェイス127.0.0.1(localhost)を使用してください。データベース、またはテストのためだけにその逆。
これ以上の調査はしていませんが、ドライバーとデータベースのバージョンが離れすぎている場合にも発生する可能性があります。インストールされたOracleとドライバーを一致させることはそれほど難しくありません。
接続が感染しているか無効である可能性があります。 JDBC接続が接続プールからのものである場合は、必ず予約時に接続をテストしてください。
Ojdbc7.jarで修正された問題-バージョン12.1.0.2(jarのMETA-INFファイルで確認できるバージョン)