2012-02-10 2 views
0

Java에서 postgresql 데이터베이스로 데이터를 삽입합니다. jdbc postgresql 드라이버를 사용하여 연결합니다. 나는 일련의 진술을 만들고 한 번에 삽입하기 위해 보낸다. 그러나 연결이 손실되면 java는 연결 풀링을 사용하여 데이터베이스에 다시 연결을 시도합니다. 배치를 다시 실행하려고 시도했지만 레코드가 삽입되지 않았습니다.예외 이후에 jdbc 배치 구문 유지

PreparedStatement pstmt = connection.prepareStatement(INSERT_RECORD_TABLE_SQL); 

while (iterator.hasNext()) { 

pstmt.setLong(1, toLong(fields[0])); 

pstmt.setLong(2, toLong(fields[1])); 

.... 

pstmt.addBatch(); 

} 

try{ 

pstmt.executeBatch(); 

} catch (Exception e) { 

    Thread.sleep(60000); 

    pstmt.executeBatch(); 

} 

내 질문은 그게 내가 예외가 발생했을 경우 실행할 수있는 문장의 배치를 유지할 수있다?

감사합니다,

Saurabh 굽타

답변

2

일반적인 예외를 잡기 위해 나쁜 일이다.

1 분 또는 다른 "인간"시간 값으로자는 것이 좋지 않습니다.

아무 것도 발생하지 않은 것처럼 catch 블록에서 동일한 코드를 다시 실행하는 것은 좋지 않지만 거기에서 예외를 처리하는 것은 바람직하지 않습니다. catch 블록에서 새로운 예외를 catch해야합니다. 더 나은

:

try 
{ 

    int[] updateCounts = pstmt.executeBatch(); 

} 
catch (BatchUpdateException be) 
{ 
    // if one of the commands sent to the database fails to execute properly 
    // or attempts to return a result set 
    handleException(be); 
    return; 
} 
catch (SQLException se) 
{ 
    //if a database access error occurs, this method is called on a closed Statement 
    //or the driver does not support batch statements 
    handleException(se); 
    return; 
} 

당신은 거래를해야합니까? 즉, 시작하기 전에 db가 있던 상태로 롤백해야하는 경우 오류가 발생하거나 다시 시도해도됩니까?

+0

BatchUpdateException을 사용하고 있지만 질문에서 잘못 언급했습니다. 다시 데이터베이스에 다시 연결되도록 스레드를 잠자기 상태로 놓습니다. 일괄 처리를 다시 실행하지 않으면 데이터가 손실됩니다. 제발 나를 수정하십시오 제가 틀린 경우 preparedStatement.executeBatch()는 하나 이상의 트랜잭션이 아닌 둘 이상의 명령문으로 전체 일괄 처리를 업데이트합니다. 그래서 같은 배치를 다시 삽입하려고 시도하고 싶습니다. – Saurabh

+0

그것은 사용중인 Java 버전에 따라 다릅니다. _ "Java 2 SDK, Standard Edition, 버전 1.3에서 가능한 구현 및 반환 값이 수정되어 BatchUpdateException 객체가 발생 된 후 배치 업데이트에서 명령을 계속 처리 할 수있는 옵션을 수용 할 수 있습니다."_ – vulkanino