2009-06-04 3 views
1

JDBC 호출을하고 데이터베이스에서 데이터를 ResultSet으로 가져 왔다고 가정합니다. 그러나 네트워크 문제로 인해 데이터베이스 연결이 끊어졌습니다.연결 후 ResultSet의 동작이 손상되었습니다.

(Connection, StatementResultSet은 DB에서 닫히지 않음). ResultSet을 계속 반복 할 수 있습니까?

답변

4

매우 특정한 jdbc 드라이버에 대해 코딩하지 않는 한 가능하면 불가능합니다. 어떤 경우에는 결과 집합이 전혀 작성되지 않습니다. 다른 것들 (Oracle IIRC)에서는 합계에서 몇 개의 행만을 가져 오도록 구성 할 수 있습니다.

그러나 일반적으로 연결이 끊어지면 부분적으로 가져온 resulst set 객체를 반복 할 수 있는지 궁금해하는 것보다 더 많은 것을 염려해야합니다. 그러한 경우에, 경험칙은 가장 나쁜 가정을하기 위해,

  1. 이다.
  2. 결과 집합을 닫으려고하면 문과 연결; 실제 연결이 끊어 지더라도 메모리 과 같은 리소스가 있고 처리 할 필요가있는 호출 측 의 파일 핸들이있을 수 있습니다.
  3. 가능한 경우 새로운 연결 (새로운 물리적 번호 하나 또는 연결 풀에서)과 사이의 연결을 다시 시작하십시오.

또한, 경험적으로 볼 때 트랜잭션 내에서 명령문을 실행할 때 부분적으로 실패하지 않아도됩니다. 폐기하고 다시 시도하십시오.

드문 경우이지만 DB에서 작업을 다시 시도 할 수 있는지 여부를 알 수있는 공급 업체 특정 코드 (SQLException.getErrorCode())를 보낼 수 있습니다. 오라클은 삽입을 수행하고 고유 제한 사항을 위반 한 경우 몇 가지 특정 코드를 가지고 있습니다 (기억하지 마십시오). 때로는 이러한 실패한 작업을 다시 시도 할 수 있지만 공급 업체 및 비즈니스에 따라 다릅니다.

일반적으로 멍청한 결과 집합을 덤프하고 다시 시작하기 만하면됩니다.

3

전적으로 JDBC 드라이버가 어떻게 처리하는지에 달려 있다고 확신합니다. 연결이 끊기기 전에 모든 결과를 버퍼링했을 수 있습니다. 연결이 끊기기 전에 다음 10 개의 결과 만 버퍼링했을 수 있습니다. 모든 결과가 버퍼링 된 경우에도 버퍼링 된 결과를 반복 처리하기 전에 드라이버 자체에서 예외가 발생하기 시작할 수 있습니다.

개인적으로 네트워크 중단 이후의 모든 동작은 정의되지 않은 것으로 간주됩니다.

1

일반적으로 모든 종류의 "전체 결과 집합"개체는 전체 행 집합을 성공적으로 수신 할 때까지 완전히 구성되지 않습니다. 예를 들어 객체에 NumberRecordsAffected와 같은 속성이 있으면 모든 행을 받았어야합니다.

그러나 GetFirstRow/GetNextRow와 같은 열거 가능한 객체는 일반적으로 한 번에 한 행 덩어리를 가져 오므로 현재 버퍼가 고갈되고 (모든 행을 버퍼링 할 때까지) 연결이 끊어 졌음을 알지 못합니다. db에서 다음 행을 가져옵니다.

어느 경우 든 예외가 발생할 것으로 예상되지만 IANAJDBCD (jdbc 개발자는 아님)입니다.

관련 문제