MySQL JDBC查询比JMH测试中应该快得多



我目前正在尝试使用JHM对MySQL查询进行基准测试。为此,我使用 JDBC 与 dockerized 服务器建立了连接。

我的代码:

@Benchmark
public void testWithPreparedStatement(Blackhole bh) throws SQLException {
    PreparedStatement st = connection.prepareStatement(query);
    st.setString(1, "Parameter1");
    st.setString(2, "Parameter2");
    bh.consume(st.executeQuery());
    connection.commit();
    st.close();
}

这些是测试结果:

# Warmup Iteration   1: 2.318 ms/op
Iteration   1: 2.038 ms/op
Iteration   2: 1.972 ms/op
Iteration   3: 1.908 ms/op
Iteration   4: 2.000 ms/op
Iteration   5: 1.960 ms/op
Iteration   6: 1.939 ms/op
Iteration   7: 1.968 ms/op
Iteration   8: 1.959 ms/op

查询包含多个联接,数据库包含数据,因此基准不应太低。

DataGrip 中的相同查询会导致:

0 rows retrieved in 59ms (execution: 32ms, fetching: 27ms)

我尝试过的:

  • @TearDown方法中运行RESET QUERY CACHEFLUSH TABLES

  • @TearDown设置为Level.Iteration

  • autoCommit设置为false并手动提交查询(请参阅:代码(+ 将TransactionLevel设置为READ_COMMITTED

查询使用 JDBC 返回的结果是正确的,因此可以正确执行。

有什么想法吗?感谢所有帮助!

似乎

"问题"与使用PreparedStatement有关,一旦我切换到正常Statement,我就会得到与Datagrip相同的时间值。

从这个 SO 答案中,我发现PreparedStatement执行"SQL 语句的预编译和数据库端缓存",这可能会导致更快的执行时间。

所以我现在使用的较慢代码:

    @Benchmark
    public void testWithStatement(Blackhole bh) throws SQLException{
        Statement st = connection.createStatement();
        ResultSet rs = st.executeQuery(query);
        bh.consume(rs.next());
    }

相关内容

  • 没有找到相关文章

最新更新