我目前正在尝试使用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 CACHE
和FLUSH 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());
}