2017-11-17 6 views
0

Java의 준비된 문에 문제가 있습니다. 예외는 매우 명확 것 같다 :세 서버 중 하나에서만 발생하는 SQL 예외

Root Exception stack trace: com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(SQLServerStatement.java:1973) at org.apache.commons.dbcp.DelegatingStatement.getGeneratedKeys(DelegatingStatement.java:315)

그것은 기본적으로 우리가 실행되기 전에 쿼리 결과를 가져 오기 위해 노력하고 있다고 주장한다. 그럴듯한 소리. 이제이 예외의 원인이되는 코드는 다음과 같습니다.

... 

    preparedStatement.executeUpdate(); 

    ResultSet resultSet = preparedStatement.getGeneratedKeys(); 
    if(resultSet.next()) { 
     retval = resultSet.getLong(1); 
    } 

    ... 

자세히 알 수 있듯이, 우리는 명령문을 실행 한 후에 쿼리 결과를 가져옵니다.

이 경우 우리는 성공적으로 실행 한 INSERT 쿼리의 ResultSet에서 생성 된 키를 가져 오려고합니다.

문제

우리는 (고정 표시기의 용기에, 부하 분산) 세 가지 다른 서버에서이 코드를 실행합니다. 이상하게도이 예외 만 세 번째 도커 서버에서 발생합니다. 다른 두 개의 도커 서버는 이 결코이 아니며이 예외가 발생했습니다.

추가 : 실패한 쿼리는 하루에 약 13000 회 실행됩니다. (4500은 서버 3에 의해 처리됨) 대부분의 경우 쿼리는 서버 3에서도 잘 작동합니다. 때로는 하루에 20 번 말하면 쿼리가 실패합니다. 항상 동일한 쿼리, 항상 동일한 서버. 다른 서버 중 하나만 사용하면 안됩니다.

우리가

  • 을 시도했습니다 무엇 우리는 소프트웨어 버전을 확인. 그러나 모든 서버가 동일한 도커 이미지로 실행되기 때문에 이것은 모두 동일합니다.
  • Java 용 최신 Microsoft SQL 드라이버
  • PreparedStatementsPreparedStatement.RETURN_GENERATED_KEYS 매개 변수를 사용하여 구성되었는지 확인했습니다.

도커 이미지가 모두 동일하므로 일부 서버 구성 관련 문제 인 것처럼 보입니다. 그러나 우리는 원인을 찾을 수 없습니다. 누구든지 문제가있을 수있는 제안이 있습니까? 아니면 누구도이 문제를 겪어 본 적이 있습니까?

답변

0

알다시피, 배치 실행의 경우 getGeneratedKeys()는 SQL Server에서 지원되지 않습니다. 여기

은 아직 만족하지 않는 기능 요청입니다 : https://github.com/Microsoft/mssql-jdbc/issues/245

내 제안을 당신에 어떤 이유로 세 번째 서버 배치 삽입 contitiously 실행 된 경우이 다른 두 가지의 경우에 (당신이 언급 한 예외를 일으킬 수 있다는 것입니다 하나의 항목 만 삽입 됨)

당신은 이것을 확인하기 위해 SQL 문을 기록하려고 시도 할 수 있습니다.

+0

답해 주셔서 감사합니다. 나는 당신의 제안을 시도 할 것이지만 같은 코드가 한 서버에서 실패하고 다른 서버에서 실패한 이유를 설명하지는 않습니다. – Harrie