Amazon RDS Oracle 인스턴스에 연결할 때 "읽기 호출에서 빼기 1"오류에 접근하는 방법
Amazon RDS 인스턴스에서 Oracle 11GR2를 실행하고 있습니다. 때때로 나는 IO Error: Got minus one from a read call전화를 걸 때를 받고 DriverManager.getConnection(getUrl())왜 그런지 잘 모르겠습니다. 다른 응용 프로그램이 올바르게 작동합니다.
더 혼동을주기 위해 오류는 가끔 (프로그램의 다음 반복 이후) 스스로 수정됩니다.
"읽기 호출에서 빼기 1"오류에 어떻게 접근해야합니까?
전체 스택 추적 :
java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:243)
at com.cwd.facile.db.Database.<init>(Database.java:44)
at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.java:29)
at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205)
at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.java:188)
at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970)
at com.cwd.facile.Main.main(Main.java:47)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
at oracle.net.ns.Packet.receive(Packet.java:311)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:300)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
... 12 more
Database.java 라인 44 : setConn(DriverManager.getConnection(getUrl()));
기타 정보 :
- 나는 그것이 잘못된 JDBC URL이라고 생각했지만 때로는 실패하기 전에 며칠 동안 작동합니다.
- Amazon RDS는 관리 형 인스턴스이며 구성 변경이 불가능할 수 있습니다.
- 연결을 위해 ojdbc6.jar을 사용하고 있습니다.
문제의 즉각적인 원인은 JDBC 드라이버가 "다른 쪽 끝"에 의해 닫힌 네트워크 소켓에서 읽기를 시도했기 때문입니다.
이것은 몇 가지 이유 때문일 수 있습니다.
원격 서버가 IP로부터의 연결을 허용하지 않도록 구성된 경우 (예 : "SQLNET.ora"파일에서).
JDBC URL이 올바르지 않으면 데이터베이스가 아닌 다른 항목에 연결을 시도 할 수 있습니다.
데이터베이스 서비스에 대한 열린 연결이 너무 많으면 새 연결을 거부 할 수 있습니다.
증상을 감안할 때 "너무 많은 연결"시나리오가 가장 가능성이 높다고 생각합니다. 이는 애플리케이션이 연결을 유출하고 있음을 나타냅니다. 즉, 연결을 만든 다음 (항상) 닫지 못합니다.
우리는 같은 문제에 직면하여 수정했습니다. 다음은 이유와 해결책입니다.
문제
연결 풀 메커니즘을 통해 데이터베이스 연결을 생성하면 앱 서버 (여기서는 JBOSS)가 min-connection 매개 변수에서 언급 한대로 연결을 생성합니다. 10 개의 응용 프로그램이 실행 중이고 각 응용 프로그램이 10 개로 최소 연결이있는 경우 총 100 개의 세션이 데이터베이스에 생성됩니다. 또한 모든 데이터베이스에는 최대 세션 매개 변수가 있습니다. 총 연결이 해당 경계를 넘으면 "읽기 호출에서 1을 뺀 값"을 얻습니다. 참고 : 아래 쿼리를 사용하여 총 세션을 확인합니다.
SELECT username, count(username) FROM v$session
WHERE username IS NOT NULL group by username
솔루션 : DBA의 도움으로 모든 애플리케이션 최소 연결이 수용 할 수 있도록 최대 세션을 늘 렸습니다.
나는 Stephen C의 대답을 보강하고 싶습니다. 제 경우는 첫 번째 점에 있습니다. 따라서 회사에서 IP 주소를 할당하기 위해 DHCP가 있기 때문에 DHCP는 당연히 나도 오라클도 묻지 않고 내 컴퓨터의 주소를 변경했습니다. 그래서 파란 오라클은 아무것도하지 않고 마이너스에게 두려운 예외를주었습니다. 따라서이 문제를 영원히 해결하고 싶고 SQLNET.ora 파일의 TCP.INVITED_NODES가 여기 에 명시된대로 와일드 카드를 허용하지 않기 때문에 IP 주소 대신 컴퓨터의 호스트 이름을 추가 할 수 있습니다.
'program story' 카테고리의 다른 글
| CSS를 사용하여 웹 양식의 특정 컨트롤 주위에 그룹 상자 만들기 (0) | 2020.11.28 |
|---|---|
| Android : 인 텐트를 통해 특정 폴더를 열고 파일 브라우저에 해당 콘텐츠를 표시하는 방법은 무엇입니까? (0) | 2020.11.28 |
| gateway.sandbox.push.apple.com에 연결할 때 "verify error : num = 20" (0) | 2020.11.28 |
| null 객체 참조에 대한 android.content.Context.getPackageName () ' (0) | 2020.11.28 |
| git 명령에서 'origin'과 'remote'의 차이점은 무엇입니까? (0) | 2020.11.28 |