2012-08-27 3 views
10

저는 preparedStatement 캐싱에 대해 일부 "maxStatements"가 정의 된 c3p0을 사용하고 있습니다. 이 캐싱은 실제로 무엇을합니까? 어떤 종류의 데이터를 캐시합니다. 어떤 레벨에서 (db, application, ..)? 예를 들어 이해하면 좋을 것입니다. 예를 들어 나는 쿼리가있다.PreparedStatement 캐싱 - 무슨 뜻입니까 (작동 방식)

select * from sometable where somecolumn =?

이제 캐시되지 않은 준비된 명령문으로 보냅니다. 그리고 지금 나는 그것을 보내고 그것은 캐시됩니다. 차이점은 무엇입니까? 첫 번째 경우와 두 번째 경우에서 어떤 일이 일어 났습니까? 첫 번째 경우와 두 번째 경우 DB 서버에 무엇이 전송됩니까?

감사합니다.

답변

9

캐싱하지 않으면 Connection에서 요청할 때마다 새 PreparedStatement가 제공됩니다. 캐싱을 사용하면 동일한 SQL 문자열을 제공하면 PreparedStatement 유형의 동일한 Java 객체를 자주 얻을 수 있습니다. 다른 매개 변수를 사용하는 경우에도 PreparedStatement에 동일한 SQL을 제공하면 동일한 PreparedStatement를 계속 사용하는 경우에만 데이터베이스에서 실행 계획과 같은 정보를 재사용 할 수 있습니다. 캐싱을 사용하면 앱이 PreparedStatement 참조 자체를 유지할 필요가 없으므로이를 더 쉽게 수행 할 수 있습니다.

8

John Watts의 대답은 매우 좋습니다.

Statement 캐싱이 투명하기 때문에 제공 할 수있는 예제 코드가 없다는 점에 유의하십시오. 구문을 사용하는 코드는 그렇지 않은 코드와 똑같은 모양입니다. c3p0에서 maxStatements 및 maxStatementsPerConnection을 양수 값으로 설정하여 Statement 캐싱을 켜기 만하면됩니다.

성명 캐싱의 성능 이점은 데이터베이스/JDBC 드라이버에 따라 다릅니다. 성명 캐싱이 도움이되는지 확인하려면 먼저 성명 캐싱을 사용하여 앱을 프로파일 링 한 다음 maxStatementsPerConnection을 앱이 반복적으로 사용하는 준비된 성명 쿼리의 수로 설정하십시오. 일부 앱/데이터베이스/드라이버의 경우 상당한 이점이 있습니다. 다른 사람들에게는 물질적 인 혜택을 볼 수 없습니다.

+0

어림짐작이 있습니까? 내 응용 프로그램은 순차적으로 약 100 개의 다른 sqls를 실행하므로 PreparedStatement 풀을 50 개의 히트 비율과 같게하면 0이됩니다 (LRU?). – j23

+1

가장 간단한 방법은'maxStatementsPerConnection'을 사용하고 응용 프로그램에서 자주 사용하는 PreparedStatements 수로 설정하는 것입니다. (응용 프로그램 초기화에 사용되는 명령문을 무시하거나 관리 목적으로 자주 사용되지 않는 명령문 등) 앱이 항상 순차적으로 100 개의 PreparedStatement를 실행하는 경우 'maxStatementsPerConnection'을 100으로 설정하면 위험 할 수 있습니다 그 기억과 자원의 발자취가 어떤 이점보다 중요 할 것이며 당신은 없이는 더 나아질 것입니다. 너는보아야 할 것이다. –

관련 문제