2011-03-31 3 views
9

컴파일이 잘못된 SQL 구문을 사용하여 준비된 문을 작성한 경우 을보고했기 때문에 문을 "미리 컴파일"하면 어떤 문제가 발생합니까? 문제가 발생했습니다.JDBC PreparedStatement를 미리 컴파일하면 어떤 일이 발생합니까?

그래서 준비된 명령문을 사전 컴파일하면 구문 유효성을 검사하지 않으면 실제로 무엇을합니까?

+0

어디에서 오류가 발생합니까? 컴파일 할 때 또는'prepare .. (..) '를 호출 할 때 – Bozho

+2

이것은 데이터베이스와 드라이버에 의존한다. JDBC 스펙은 이것을 규정하지 않습니다. – skaffman

+0

내가 prepareStatement를 호출 할 때 – xdevel2000

답변

14

PreparedStatements을 만들면 SQL 구문 유효성 검사 또는 DB 서버 라운드 트립이 포함될 수도 있고 그렇지 않을 수도 있습니다.이 트립은 전적으로 사용되는 JDBC 드라이버에 따라 다릅니다. 일부 운전자는 왕복 또는 유효성 검사를 수행하고 다른 운전자는 유효성 확인을하지 않습니다.

일부 JDBC 드라이버에서 PreparedStatement은 보통 Statement보다 "준비"되지 않습니다. 즉, 일부 JDBC 드라이버의 경우 PreparedStatement은 서버 측 리소스 (Connection과 유사 함)를 나타내지 만 다른 클라이언트에서는 순수한 클라이언트 측 구조입니다.

그러나 중요한 차이점은 PreparedStatement은 수동으로 SQL 문 문자열에 값을 삽입하려고 할 때 발생할 수있는 이스케이프 또는 형식 지정 문제를 방지하는 방식으로 동적 매개 변수 값을 처리하는 데 도움이된다는 것입니다 일반 Statement을 사용하여 실행하십시오.

이 기능은 사전에 "준비 중"을 선택했기 때문에 독립판이므로 다른 준비 단계를 수행하지 않더라도 모든 JDBC 드라이버에서 제공합니다.

+0

... prepareStatement 메소드가 데이터베이스에 컴파일을위한 SQL 문자열을 보내고 제공된 경우 DB가 유효성 검사를 수행한다고 말할 수 있습니다. 컴파일 된 명령문 이후에 다시 반송되고 PreparedStatement 객체로 캡슐화됩니다. – xdevel2000

+1

@xdevel : 예, 일부 JDBC 드라이버/데이터베이스가이를 수행합니다. 서버는 대개 핸들을 다시 보냅니다. 그런 다음'PreparedStatement'를 실행하면 JDBC 드라이버는 단순히 "Execute statement 4 to these arguments : ...") 서버에 알려줍니다. –

1

'statement compilation'은 결과를 더 빠르고 효율적으로 반환하는 데 도움이되는 데이터베이스에서 발생합니다. PreparedStatement를 사용하면 데이터베이스가 이미 컴파일 된 명령문을 재사용 할 수 있고 다시 수행해야 할 필요가 없게됩니다. 잘못된 SQL은 데이터베이스 문을 잘못 컴파일하지만 항상 그런 것은 아닙니다.

관련 문제