program story

Amazon RDS Oracle 인스턴스에 연결할 때 "읽기 호출에서 빼기 1"오류에 접근하는 방법

inputbox 2020. 11. 28. 09:15
반응형

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 주소 대신 컴퓨터의 호스트 이름을 추가 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/19660336/how-to-approach-a-got-minus-one-from-a-read-call-error-when-connecting-to-an-a

반응형