使用Spring jdbcTemplate与普通PreparedStatement相比,性能受到了影响

时间:2012-03-08 08:44:59

标签: java oracle spring jdbctemplate

我只是对复杂系统进行基准测试,发现通过Spring的查询非常慢。

它增加了~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)。

我已经进行了十几次测试,结果很稳定。

Spring jdbcTemplate做了什么,PreparedStatement没有做什么?

2 个答案:

答案 0 :(得分:2)

由于我上面的评论似乎是正确答案,我会将其作为未来咨询的答案发布。

@Felix,重用连接与spring无关,但如果你有连接池,则与你的连接池无关。所以应该考虑到这一点。

基本上我认为春天项目中缺少连接池。

答案 1 :(得分:0)

您的第一个案例执行更新查询,而第二个案例执行选择查询。第二个应该使用ps.executeUpdate()与第一个类似。