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) 내의 무언가가 리소스 사용 불가능 등으로 인해 작동을 중지하기로 결정했음을 의미합니다.코드나 삽입 횟수와는 무관합니다.유사한 문제에 대한 자세한 내용은 여기를 참조하십시오.
- http://kr.forums.oracle.com/forums/thread.jspa?threadID=941911
- http://forums.oracle.com/forums/thread.jspa?messageID=3800354
이것이 당신의 질문에 답하지 못할 수도 있지만, 왜 이런 일이 일어나고 있는지 알 수 있을 것입니다.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
'source' 카테고리의 다른 글
| 경고:어레이 또는 반복기 내의 각 자녀는 고유한 "키" 프로펠러를 가져야 합니다.ListView의 렌더 메서드를 확인합니다. (0) | 2023.03.28 |
|---|---|
| Spring Boot에서 여러 SQL Import (0) | 2023.03.28 |
| mvn spring-boot 종료: run does stop tomcat (0) | 2023.03.23 |
| $watch ng 격리 범위를 사용하는 내부 지시어 모델 (0) | 2023.03.23 |
| 리액트 라우터 스위치의 동작 (0) | 2023.03.23 |