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 드라이버
PreparedStatements
이PreparedStatement.RETURN_GENERATED_KEYS
매개 변수를 사용하여 구성되었는지 확인했습니다.
도커 이미지가 모두 동일하므로 일부 서버 구성 관련 문제 인 것처럼 보입니다. 그러나 우리는 원인을 찾을 수 없습니다. 누구든지 문제가있을 수있는 제안이 있습니까? 아니면 누구도이 문제를 겪어 본 적이 있습니까?
답해 주셔서 감사합니다. 나는 당신의 제안을 시도 할 것이지만 같은 코드가 한 서버에서 실패하고 다른 서버에서 실패한 이유를 설명하지는 않습니다. – Harrie