gpt4 book ai didi

java - MySQL JDBC 查询比 JMH 测试中应有的速度快得多

转载 作者:行者123 更新时间:2023-11-29 16:20:29 25 4
gpt4 key购买 nike

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

我的代码:

@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 中相同的时间值.

来自this SO answer我发现 PreparedStatement 执行“SQL 语句的预编译和数据库端缓存”,这可能会导致更快的执行时间。

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

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

关于java - MySQL JDBC 查询比 JMH 测试中应有的速度快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54543146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com