我正在检查原始查询PreparedStatement之间的一些sql查询性能差异。由于我是使用JMH的初学者,所以无法了解内部流如何调用我们的方法。在以下代码中感到困惑:-
private static final String url = "jdbc:postgresql://localhost:5432/postgres";
static Connection getConnection(){
try {
conn = DriverManager.getConnection(url, user, password);
System.out.println("Connected to the PostgresSQL server successfully. ");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;
}
@Benchmark
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.SingleShotTime)
@Fork(value = 1, warmups = 5)
public static String executeSql() {
if(conn == null) {
conn = getConnection();
}
String query = "select * from EmpDetails where EMP_ID=123 ";
try (Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
return rs.getString(1);
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return "";
}
结果:-
基准模式:单次调用时间
基准:com.mnk.BenchMarking.executeSql
运行进度:完成0.00%,ETA 00:00:00
预热分叉:第1次,共5次
迭代1:成功连接PostgresSQL服务器
190.550 ms/op
运行进度:完成10.00%,ETA 00:00:11预热叉:2/5迭代1:成功连接到PostgresSQL服务器
174.217ms/op
运行进度:完成20.00%,ETA 00:00:09预热叉:第3个,共5个迭代1:成功连接到PostgresSQL服务器
175.219 ms/op
运行进度:完成30.00%,ETA 00:00:08预热叉:4/5迭代1:成功连接到PostgresSQL服务器
180.964 ms/op
运行进度:完成40.00%,ETA 00:00:07预热叉:5个,共5个迭代1:成功连接到PostgresSQL服务器
163.894 ms/op
这里我希望getConnection((方法只调用一次,并且该连接对象将在每次迭代中重复使用。但是getConnection((方法也为每次迭代调用,这导致了无效的结果。同样由于这个原因,我无法评估executeQuery((的性能。
请有人告诉我如何处理这个问题。
在JMH中,您应该将所有初始化例程保留在用@Setup
注释的方法中,请参阅JMH Samples中的示例:https://github.com/openjdk/jmh/blob/master/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_05_StateFixtures.java