programing

SQL 예외: 오라클의 프로토콜 위반

linuxpc 2023. 8. 29. 20:11
반응형

SQL 예외: 오라클의 프로토콜 위반

"프로토콜 위반"을 받고 있습니다.RedHat Linux에서 실행 중인 응용 프로그램이 있습니다.데이터베이스와 애플리케이션은 시스템에 공존합니다.

파일: Oracle 11g R2(11.2.0.3.0)
사용된: JDBC 파일: 12.1.0.1
: 사용자: jdk1.7.0.65 32비트

저는 이 오류가 드라이버 문제로 지적된 많은 포럼을 접했지만 모든 포럼에서 사용된 Oracle 버전이 더 높고 드라이버 버전이 더 오래되었으며 드라이버를 변경하면 문제가 해결되었습니다.하지만 저의 경우 Oracle 버전은 더 낮지만 드라이버 버전은 더 높습니다.그렇다면 이 경우 상위 버전의 드라이버가 문제가 될 수 있습니까?

또한 이 프로토콜 위반은 DB의 최대 연결 수에 도달할 때도 발생할 수 있습니다.

오류 메시지:

java.sql.SQLException: 프로토콜 위반: [72], oracle.jdbc.driver.oracle.jdbc.driver에서 T4CTIfun.receive(T4CTIfun.java:464).oracle.jdbc.driver에서 T4CTIfun.doRPC(T4CTIfun.java:192).t4C8Oall.doOALL(T4C8Oall.java:531)을 oracle.jdbc.driver에 저장합니다.t4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)이 oracle.jdbc.driver에 있습니다.t4CPreparedStatement.executeForDescription(T4CPreparedStatement.java:884)의 aracle.jdbc.driver.Oracle.jdbc.driver의 OracleStatement.exeMayDescription(OracleStatement.java:1167).Oracle.jdbc.driver의 OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289).Oracle PreparedStatement.executeoracle.jdbc.driver의 내부(OraclePreparedStatement.java:3584).Oracle PreparedStatement.executeoracle.jdbc.driver에서 쿼리(OraclePreparedStatement.java:3628).Oracle Prepared StatementWrapper.execute쿼리(Oracle Prepared StatementWrapper.java:1493)

힙 공간을 늘립니다!

저는 이 정확한 오류가 무작위로 나타났습니다.

응용 프로그램의 메모리가 부족하고 코드의 로직으로 인해 관련 없는 예외가 발생하여 OutOfMemory 오류가 손실되었습니다.

애플리케이션이 폐기 가능성과 오류를 처리하지 않아야 하는 이유 중 하나입니다.

이러한 오류는 서버가 와이어(소켓)에서 반환하는 내용을 이해할 수 없는 JDBC Thin 드라이버의 버그를 나타냅니다.

버그가 해결되기를 바라며 항상 최신 JDBC 씬 드라이버를 사용할 수 있습니다.오늘 현재 최신 버전은 12.1.0.2입니다.

그래도 도움이 되지 않으면 Oracle 지원팀에 문의해야 합니다.먼저 이 오류가 발생한 연결의 sqlnet 추적을 제공해야 합니다.이를 통해 Oracle 엔지니어는 장애가 발생했을 때 네트워크에서 어떤 일이 발생했는지 파악할 수 있습니다.

sqlnet 추적을 설정하려면 서버에서 sqlnet.ora 파일을 편집하고 다음을 추가합니다.

TRACE_LEVEL_SERVER = 16

서버의 각 연결에 대한 추적 파일을 추가합니다.프로덕션 시스템에서는 이 작업을 수행하지 마십시오. 시스템 속도가 크게 느려지고 엄청난 양의 추적이 생성됩니다.

행운을 빌어요.

제 경우, 현재 시퀀스 값을 가져오기 위해 PreparedStatement의 getGeneratedKeys()를 사용하면 프로토콜 위반 예외가 발생했습니다.다음과 같이 시퀀스에서 시퀀스 전류 값을 가져옵니다.

String curSeqValQuery = "SELECT seq_name.CURRVAL FROM DUAL";
...
statement = con.prepareStatement(curSeqValQuery);
resultSet = (OracleResultSet) statement.executeQuery();
...

문제를 해결했습니다.

ojdbc7.jar - 버전 12.1.0.2에서 해결된 문제(jar의 META-INF 파일에서 확인할 수 있는 버전)

이는 일반적으로 tcp/ip 트래픽이 손상되었음을 나타냅니다.이는 주입된 트래픽 또는 손실된 패킷 때문일 수 있습니다.를 .ifconfig비정상적으로 많은 양의 손실된 패킷의 영향을 받는 네트워크 인터페이스가 있는지 확인합니다.문제를 방지하려면 데이터베이스와 Java 프로그램이 동일한 시스템에서 실행 중임을 나타내듯이 데이터베이스에 연결하기 위해 외부 IP가 아닌 루프백 인터페이스 127.0.0.1(로컬 호스트)을 사용하거나 테스트를 위해 반대로 사용해 보십시오.

더 이상 연구하지는 않았지만, 드라이버 버전과 데이터베이스 버전이 너무 멀리 떨어져 있을 때도 발생할 수 있다고 생각합니다.설치된 오라클과 일치하도록 드라이버를 가져오는 것은 그리 어렵지 않습니다.

연결이 감염되었거나 잘못되었을 수 있습니다.연결 풀에서 JDBC 연결을 가져온 경우 항상 예약 시 연결을 테스트해야 합니다.

제 경우 다른 데이터 소스에서 ojdbc 드라이버 타겟팅 dblink를 사용하여 데이터를 추출하려고 할 때 직접 데이터 소스에 연결하지 않았습니다.일단 dblink를 사용하지 않고 직접 연결하여 연결하면 문제가 발생하지 않습니다.
제가 주목한 또 다른 점은 중국어/일본어 문자가 있는 열에서 데이터를 추출하려고 할 때 일관된 방식으로 문제가 발생했다는 것입니다.
마지막으로, 데이터를 청크로 추출하는 것도 적절한 해결책으로 작용했습니다.
HTH

언급URL : https://stackoverflow.com/questions/29372626/sqlexception-protocol-violation-in-oracle

반응형