2012-03-08 3 views
2

나는 단지 복잡한 시스템을 벤치마킹하고 있으며 Spring을 거치는 쿼리는 실제로 느리다는 것을 알게되었습니다.Spring jdbcTemplate을 사용하여 성능이 정상적으로 비교 됨 PreparedStatement

~ 600ms가 추가됩니다.

case TEMPLATE: 
{ 
    t = System.currentTimeMillis(); 
    jdbcTemplate.update(getUnnamedPreparedStatement(query), new PreparedStatementSetter() { 

     @Override 
     public void setValues(PreparedStatement ps) throws SQLException { 
      int i = 1; 
      for (Object o : queryParameters) { 
       ps.setObject(i++, o); 
      } 
     } 
    }); 
    break; 
} 

case PREPAREDSTATEMENT: 
{ 
    Connection c = dataSource.getConnection(); 
    t = System.currentTimeMillis(); 
    PreparedStatement ps = c.prepareStatement(getUnnamedPreparedStatement(query)); 
    int index = 1; 
    for (Object parameter: queryParameters) { 
     ps.setObject(index++, parameter); 
    } 
    ResultSet rs = ps.executeQuery(); 
    rs.next(); 
    break; 
} 

두 쿼리는 동일한 결과를 제공하고, 순서는 중요하지 않습니다

벤치 마크 코드는 다음 비교합니다. 또한 쿼리 유형 (SELECT, UPDATE)에 의존하지 않습니다.

나는 12 번 테스트를 실행했으며 그 결과는 안정적입니다.

Spring jdbcTemplate은 PreparedStatement가 수행하지 않는 작업은 무엇입니까?

+3

참고 사항 : 준비된 문구 시나리오에서는 연결에 소요되는 시간을 포함하지 않습니다. 구성에 따라이 작업이 사소하거나 시간 소모가 적다고 가정하는 것이 안전하지 않습니다. 귀하의 답변에 대해 – pap

+0

아빠 덕분에. 그러나, 연결을 얻는 것은 나의 체제에서 arround 20ms를 잡는다. 그리고 jdbcTemplate은 기존 연결을 재사용하고 모든 업데이트에서 새로운 연결을 얻지 못한다고 가정합니다. – Felix

+1

@Felix, 연결 재사용은 봄과는 아무 관련이 없습니다. 그래서 그것은 고려되어야합니다. – tom

답변

2

위의 내 의견이 올바른 답인 것처럼 보였으므로 향후 컨설팅을위한 답변으로 게시 할 것입니다.

@Felix, 연결을 재사용하는 것은 봄과는 상관 없지만 연결 풀을 사용하는 경우에는 사용하면됩니다. 그래서 그것은 고려되어야합니다.

기본적으로 스프링 프로젝트에는 연결 풀이 없다고 생각합니다.

0

첫 번째 경우는 업데이트 쿼리를 실행하는 반면 두 번째 쿼리는 선택 쿼리를 실행합니다. 두 번째 것은 ps.executeUpdate()을 사용하여 첫 번째 것과 유사해야합니다.