source

SQL Recoverable예외:I/O 예외:접속 리셋

itover 2023. 3. 28. 21:40
반응형

SQL Recoverable예외:I/O 예외:접속 리셋

어제 저녁, 나는 내가 작성한 자바 프로그램을 실행하면서 사무실을 나왔다.JDBC 접속을 사용하여 많은 레코드를 회사 데이터베이스(Oracle)에 삽입해야 합니다.오늘 아침 업무에 복귀했을 때, 다음의 에러가 발생했습니다(트라이 캐치로 검출).

java.sql.SQLRecoverableException: I/O Exception: Connection reset

프로그램에서는 이 문제가 발생하기 전에 거의 모든 레코드를 기록했습니다만, 이 문제가 일찍 발생하면(저녁에 퇴근한 후 몇 분 후에) 어떻게 됩니까?무슨 일이 일어났는지 이해할 수 없어서 데이터베이스 관리자에게 문의했더니 데이터베이스에 특별한 문제가 없다고 합니다.

무슨 일이 일어났는지, 그리고 그것을 피하기 위해 내가 무엇을 할 수 있는지 아는가?

일부 RedHat 배포에서 오류가 발생합니다.필요한 것은 java.security.egd=file://dev/urandom 파라미터로 어플리케이션을 실행하는 것뿐입니다.

java -Djava.security.egd=file:///dev/urandom [your command]

나초 소리아노의 해결책에 대한 보완적인 답을 만들고 싶다...

저는 최근에 Java 필기 애플리케이션(실제로 Talend© ELT 작업)이 Oracle 데이터베이스에 연결하려고 했는데(11g 이상) 무작위로 실패하는 문제를 해결하기 위해 검색했습니다.OS는 RedHat Enterprise와 CentOS입니다.작업은 매우 신속하게(30분 이내) 실행되며 매우 자주 실행됩니다(5분마다 약 1회 실행).

야간에는 업무시간으로, 데이터베이스 부하가 높은 작업을 게으른 작업사용으로 사용하는 동안 한 마디로 연결이 실패하고 다음 메시지가 표시될 수 있습니다.

Exception in component tOracleConnection_1
java.sql.SQLRecoverableException: Io exception: Connection reset
        at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
    and StackTrace follow ...

##문제 설명:##

자세한 내용은 이쪽

Oracle 연결에는 적절한 보안 수준을 가정하기 위해 몇 가지 랜덤 번호가 필요합니다.Linux 난수 생성기는 키보드와 마우스 액티비티를 기반으로 몇 가지 번호를 생성하여 스택에 배치합니다.서버에서는, 그러한 액티비티가 그다지 많지 않은 것을 허가해 주십시오.따라서 소프트웨어가 발생기에서 생성할 수 있는 것보다 더 많은 난수를 사용할 수 있습니다.

풀이 비어 있으면 /dev/random에서 읽은 내용은 추가적인 환경 노이즈가 수집될 때까지 차단됩니다.또한 Oracle 연결은 타임아웃(기본값 60초)으로 감소합니다.

##솔루션1 - 1개의 앱 솔루션 고유##

솔루션은 시작 시 JVM에 다음 두 가지 파라미터를 추가하는 것입니다.

-Djava.security.egd=file:/dev/./urandom
-Dsecurerandom.source=file:/dev/./urandom

주의: '//'는 중요합니다. 떨어뜨리지 마십시오!

기동 커맨드 라인은 다음과 같습니다.

java -Djava.security.egd=file:/dev/./urandom -Dsecurerandom.source=file:/dev/./urandom -cp <classpath directives> appMainClass <app options and parameters>

이 솔루션의 한 가지 단점은 랜덤성이 영향을 받기 때문에 생성되는 수치가 약간 안전성이 떨어진다는 것입니다.군사 관련 산업이나 비밀 관련 산업에서 일하지 않는 경우 이 솔루션이 여러분의 솔루션이 될 수 있습니다.

##솔루션2 - 일반적인 Java JVM 솔루션 ##

여기서 설명한 바와 같이

솔루션 1에 제시된 두 명령어는 모두 Java 보안 설정 파일에 넣을 수 있습니다.

, 그럼 ㄴㄴㄴ데를 한 번 보세요.$JAVA_HOME/jre/lib/security/java.security

회선을 변경하다

securerandom.source=file:/dev/random

로.

securerandom.source=file:/dev/urandom

변경은 실행 중인 새로운 애플리케이션에 즉시 적용됩니다.

솔루션 #1의 경우, 이 솔루션의 한 가지 단점은 랜덤성에 영향을 미치기 때문에 생성되는 수치가 약간 안전성이 떨어진다는 것입니다.이번에는 JVM에 대한 글로벌 영향입니다.솔루션 #1의 경우, 군사 관련 산업이나 비밀 관련 산업에 종사하지 않는 경우, 이 솔루션이 귀사 솔루션이 될 수 있습니다.

Java 5 뒤에 "file:/dev/.urandom"을 사용하는 것이 이상적입니다.이전 경로가 다시 /dev/random을 가리키기 때문입니다.

보고된 버그 : https://bugs.openjdk.java.net/browse/JDK-6202721

##솔루션3 - 하드웨어 솔루션 ##

디스클러머:하드웨어 벤더 또는 제품과 연결되어 있지 않습니다.

고품질 랜덤성 수준에 도달하려면 Linux 난수 생성 소프트웨어를 하드웨어로 대체할 수 있습니다.

여기서 몇 가지 정보를 얻을 수 있습니다.

안부 전해요

토마스.

이는 단순히 백엔드(DBMS) 내의 무언가가 리소스 사용 불가능 등으로 인해 작동을 중지하기로 결정했음을 의미합니다.코드나 삽입 횟수와는 무관합니다.유사한 문제에 대한 자세한 내용은 여기를 참조하십시오.

이것이 당신의 질문에 답하지 못할 수도 있지만, 왜 이런 일이 일어나고 있는지 알 수 있을 것입니다.DBA와 더 자세히 논의하여 귀사의 사례에 특정 사항이 있는지 확인할 수 있습니다.

★★★★★★
어플리케이션 설정을 변경하여 Java 명령어 옆에 [-Djava.security.egd=file:/dev/../dev/urandom]파라미터를 설정합니다.

java - Djava . security . egd = file : / dev / .. / dev / urandom [ 명령어]

참조:- https://community.oracle.com/thread/943911

11g에서 12c로 업그레이드한 후 간헐적으로 이러한 오류가 발생했으며, 자바는 1.6으로 되어 있습니다.

수정은 java와 jdbc를 6에서7로 업그레이드하는 것이었습니다.

export JAVA_HOME='/usr/java1.7'

export CLASSPATH=/u01/app/oracle/product/12.1.0/dbhome_1/jdbc/libojdbc7.jar:$CLASSPATH 

며칠 후에도 접속이 간헐적으로 리셋된다.

위의 Java 7을 모두 삭제했습니다.자바6도 괜찮았어요.이 문제는 사용자 bash_profile에 추가함으로써 해결되었습니다.

오류가 발생한 groovy 스크립트는 배치 VM 서버에서 /dev/random을 사용하고 있었습니다.아래는 Java와 groovy가 /dev/urandom을 사용하도록 강제했습니다.

JAVA_OPTS=" $JAVA_ 내보내기OPTS - Djava . security . egd = file : //dev / urandom "

예외에 "Connection reset"이라고 표시되어 있습니다.Java 프로세스와 db 서버 간의 연결이 끊겼습니다. 이는 거의 모든 이유(네트워크 문제 등)에 의해 발생할 수 있습니다.SQL Recoverable예외는 회복 가능한 것을 의미할 뿐이지만 근본적인 원인은 접속 리셋입니다.

스파크 업무에서 오라클을 읽을 때도 비슷한 상황이었습니다.이 연결 재설정 오류는 Oracle 서버와 사용된 JDBC 드라이버 간의 비호환성으로 인해 발생했습니다.확인해 볼 만합니다.

실행 명령에 Java 보안 추가

java -jar -Djava.security.egd="file:///dev/urandom" yourjarfilename.jar

언급URL : https://stackoverflow.com/questions/6110395/sqlrecoverableexception-i-o-exception-connection-reset

반응형