2012-03-08 27 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

あなたの答えはおかげさまです。しかし、私のセットアップでは接続に20msかかる。そして、私はjdbcTemplateが既存の接続を再利用し、すべての 'update'で新しいものを取得しないと仮定します。 – Felix

+1

@Felix、接続の再利用はSpringとは関係ありません。だからそれは考慮に入れるべきです。 – tom

答えて

2

上記の私のコメントは正解と思われるので、将来のコンサルティングのための回答として投稿します。

@Felix接続を再利用することは、春とは関係ありませんが、接続プールを使用している場合はそれを使用します。だからそれは考慮に入れるべきです。

基本的に私は春のプロジェクトで接続プールが欠落していたと思います。

0

最初のケースは更新クエリを実行し、2番目のクエリは選択クエリを実行します。 2番目のものはps.executeUpdate()を使用して最初のものに似ているはずです。

関連する問題