私は複雑なシステムをベンチマークしているだけで、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では何をしませんか?
ちょうど注:あなたの準備されたステートメントシナリオでは、接続にかかる時間は含まれていません。あなたの設定によっては、この操作が些細なものであるか、時間のかかるものではないと考えるのは安全ではありません。 – pap
あなたの答えはおかげさまです。しかし、私のセットアップでは接続に20msかかる。そして、私はjdbcTemplateが既存の接続を再利用し、すべての 'update'で新しいものを取得しないと仮定します。 – Felix
@Felix、接続の再利用はSpringとは関係ありません。だからそれは考慮に入れるべきです。 – tom