2011-07-17 2 views
1

,이 JDBC 코드 500-600ms 얻어 타이밍 그러나ScalaQuery의 query/queryNA가 JDBC보다 몇 배 느린가요? 많은 검색어는 다음 성능 테스트에서

 val ids = queryNA[String]("select id from account limit 1000").list 
     val stmt = session.conn.prepareStatement("select * from account where id = ?") 
     debug.time() { 
     for (id <- ids) { 
      stmt.setString(1, id) 
      stmt.executeQuery().next() 
     } 
     } 

을 ScalaQuery를 사용하면, 시간 이동에> 2S :

 val ids = queryNA[String]("select id from account limit 1000").list 
     implicit val gr = GetResult(r =>()) 
     val q = query[String,Unit]("select * from account where id = ?") 
     debug.time() { 
     for (id <- ids) { 
      q.first(id) 
     } 
     } 

디버깅 후에 서버 로그의 경우 PreparedStatement가 반복적으로 준비되고 재사용되지 않기 때문에 발생합니다.

실제로 이것은 우리 애플리케이션 코드에서 성능 문제가 발생했기 때문에 ScalaQuery에서 Prepared Statement를 올바르게 재사용하는 방법과 관련하여 뭔가 빠졌는지 궁금해하고 있습니다. 제안 된 해결 방법.

+0

실제로 실행중인 코드 인 경우 첫 번째 예에서 HotSpot이 루프를 버리는 것이 아니라, 그것은 실제로 명령문을 1000 번 실행한다는 것입니다. – ig0774

+0

멀리 던지지 않음 - executeQuery에는 부작용이 있습니다. – Yang

답변

1

scalaquery 메일 링리스트에서 답변을 얻었습니다. 이것은 스칼라 쿼리가 설계된 방법입니다. 아래에 명령문 풀링을 제공하는 것으로 가정합니다.

요즘 ScalaQuery는 항상 Connection으로부터 새로운 PreparedStatement를 요청합니다. 이전 버전에서는 PreparedStatements에 대한 캐시가 있었지만 이미이 문제에 대한 좋은 해결책이 있기 때문에 제거했습니다. 괜찮은 연결 풀에는 PreparedStatement 풀링 옵션이 있어야합니다. Java EE 서버를 사용하는 경우 통합 연결 풀이 있어야합니다. 독립 실행 형 응용 프로그램의 경우 다음과 같은 코드를 사용할 수 있습니다. http://sourceforge.net/projects/c3p0/