2009-06-03 4 views
3

서블릿 환경 (특히 Tomcat 5.5)에서 준비된 문을 캐시하는 방법을 찾고 있습니다. 이는 준비된 명령문이 작성되는 횟수, 즉 connection.prepareStatement(sql)이 호출되는 횟수를 줄이기위한 것입니다.Tomcat에서 준비된 문을 캐싱하기위한 좋은 전략은 무엇입니까?

초기 아이디어는 PreparedStatement 개체를 세션에 저장하는 것이 었습니다. 여기서 키 (특성 이름)는 쿼리 자체입니다. 이것은 또한 느리게 행해질 수 있습니다.

그러나 JDBC 드라이버 구현에 따라 동일한 준비된 문에 2 개의 스레드 (또는 요청)가 동시에 액세스 할 수 있으므로 잘못된 매개 변수가 설정되는 등의 사실에 대해 경고합니다. 따라서이 명령문 오브젝트에 대한 액세스는 동기화되어야합니다.

이것을 달성하기위한 좋은 전략은 무엇입니까?

이렇게하려면 tomcat에 내장 된 메서드가 있습니까? 나는 poolPreparedStatements DBCP 매개 변수를 언급 한 this answer을 보았지만 내가 찾고있는 것과 동일한 의미를 지닌다면 문서에서 완전히 명확하지 않다.

답변

6

PreparedStatement 캐싱은 일반적으로 사용중인 연결 풀에서 제공됩니다. c3p0에서

알림을 설정하면됩니다 , 일부 SQL 쿼리에 사용하고 풀로 반환하십시오. 그래야만 다른 스레드에서 연결을 사용할 수 있습니다. 연결 풀에 버그가없는 한 연결은 스레드간에 공유되지 않습니다 동시에 발생합니다.

BTW - 내 권장 사항은 DBCP가 아닌 c3p0을 사용하는 것입니다. DBCP에 관한 많은 문제가 있었는데 일단 c3p0으로 옮겼습니다.

0

다른 DB는 확실하지 않지만 Oracle을 사용하는 경우 JDBC 클라이언트는 PreparedStatement를 캐시합니다. 당신은 당신의 DB가 그것을하는지보기를 원할 것입니다.

관련 문제