source

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

factcode 2023. 4. 4. 22:29
반응형

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

Amazon RDS 인스턴스에서 Oracle 11GR2를 실행하고 있습니다.때때로 나는 받는다.IO Error: Got minus one from a read call에 전화를 걸 때DriverManager.getConnection(getUrl())왜 그랬는지 모르겠어다른 애플리케이션은 정상적으로 동작.

더 혼란스럽게 하기 위해서, 에러는 때때로 자동적으로 수정됩니다(프로그램의 다음 반복 후에).

"Got - 1 from read call" 오류에 어떻게 접근해야 합니까?

전체 스택 트레이스:

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

데이터베이스Java 행 44:setConn(DriverManager.getConnection(getUrl()));

기타 정보:

  • 잘못된 JDBC URL인 줄 알았는데, 실패하기 전에 며칠 동안 계속 작동하기도 합니다.
  • Amazon RDS는 관리 인스턴스이므로 구성을 변경할 수 없습니다.
  • 접속에 ojdbc6.jar를 사용하고 있습니다.

문제의 직접적인 원인은 JDBC 드라이버가 "다른 쪽 끝"에 의해 닫힌 네트워크 소켓에서 읽기를 시도했기 때문입니다.

몇 가지 이유가 있을 수 있습니다.

  • 리모트 서버가 IP로부터의 접속을 받아들이지 않도록 설정되어 있는 경우(예를 들면, 「SQLNET.ora」파일).

  • JDBC URL이 올바르지 않은 경우 데이터베이스가 아닌 다른 항목에 연결을 시도하고 있을 수 있습니다.

  • 데이터베이스 서비스에 열려 있는 연결이 너무 많으면 새 연결이 거부될 수 있습니다.

증상으로 볼 때 "연결 수가 너무 많다"는 시나리오가 가장 유력하다고 생각합니다.즉, 어플리케이션이 접속을 리크하고 있는 것을 나타냅니다.즉, 접속을 확립하고 나서 (항상) 닫지 않습니다.

우리는 같은 문제에 직면해서 그것을 고쳤다.그 이유와 해결책은 다음과 같습니다.

문제

접속 풀 메커니즘이 사용되면 애플리케이션서버(이 경우는 JBOSS)는, 다음의 순서에 따라서 접속을 작성합니다.min-connection파라미터를 지정합니다.실행 중인 애플리케이션이 10개이고 각각이min-connection그러면 데이터베이스에 총 100개의 세션이 생성됩니다.또한 모든 데이터베이스에는max-session파라미터, 총 접속 수가 그 경계를 넘으면Got minus one from a read call.

참고: 세션의 총 수를 확인하려면 아래 쿼리를 사용하십시오.

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

솔루션:델은 DBA의 도움을 받아 이를 향상시켰습니다.max-session모든 어플리케이션이 파라미터로 동작하도록min-connection수용할 수 있습니다.

호스트 옵션 "-p 1521:1521"에 대한 퍼블리시 포트가 있음에도 불구하고 도커에서 Oracle 데이터베이스를 사용했을 때 이 오류 메시지가 나타납니다.ip address 127.0.0.1을 사용하는 jdbc url을 사용하고 있었는데 호스트 머신의 실제 ip address로 변경하여 모든 것이 동작했습니다.

Stephen C의 답변에 덧붙이고 싶습니다. 제 사례는 첫 번째 점에 있었습니다.사내에 IP 주소를 할당하는 DHCP가 있기 때문에, DHCP는 물론, 나에게도 Oracle에게도 묻지 않고 머신의 주소를 변경했습니다.그래서 갑자기 신탁은 아무것도 하지 않고 무시무시한 예외를 두었습니다.따라서 TCP 이후 이 문제를 해결하려면 이 문제를 해결해야 합니다.SQLNET.ora 파일의 INVITED_NODS는 여기에 설명된 대로 와일드카드를 사용할 수 없습니다. IP 주소 대신 시스템의 호스트 이름을 추가할 수 있습니다.

도커에서 Oracle 21c XE 이미지를 로컬로 실행했을 때도 비슷한 문제가 있었습니다.localhost ★★★★★★★★★★★★★★★★★」127.0.0.1.

수정은 하여 「」를 변경하는 이었습니다.sqlnet.ora하다

echo "DISABLE_OOB=ON" >> /opt/oracle/oradata/dbconfig/XE/sqlnet.ora

컨테이너를 다시 시작합니다.

내 경우 앱에서 설정한 사용자가 DB에 존재하지 않아 동일한 예외가 발생하였고, 사용자를 생성하고 필요한 권한을 부여하여 문제를 해결했습니다.

원인

Oracle 이진 권한 문제($ORACLE_HOME/bin/oracle)

[ tst19c @exa033dbadm01 bin ]$ORACLE_HOME/bin

[ tst19c @exa033dbadm01 bin ]$ ls - ltr oracle

-rwxr-s--x 1 tst19c asmadmin 446528768 5월 3일 14:28 오라클

취한 액션

[ tst19c @exa033dbadm01 bin ]$ chmod 6751 oracle

[ tst19c @exa033dbadm01 bin ]$ ls - ltr oracle

지금이다

-rwsr-s--x 1 tst19c asmadmin 446528768 5월 3일 14:28 오라클

[tst19c@exa033dbadm01 bin]$

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

반응형