簡體   English   中英

JMH - 基准 SQL 查詢 Java

[英]JMH - Benchmarking SQL Queries In Java

我正在檢查原始查詢 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
熱身前叉:5 個中的 1 個
迭代 1:成功連接到 PostgresSQL 服務器。
190.550 毫秒/操作

運行進度:10.00% 完成,ETA 00:00:11 預熱分叉:2 of 5 迭代 1:成功連接到 PostgresSQL 服務器。
174.217 毫秒/操作

運行進度:20.00% 完成,ETA 00:00:09 預熱分叉:3 of 5 迭代 1:成功連接到 PostgresSQL 服務器。
175.219 毫秒/操作

運行進度:30.00% 完成,ETA 00:00:08 預熱分叉:4 of 5 迭代 1:成功連接到 PostgresSQL 服務器。
180.964 毫秒/操作

運行進度:40.00% 完成,ETA 00:00:07 預熱分叉:5 of 5 迭代 1:成功連接到 PostgresSQL 服務器。
163.894 毫秒/操作

在這里,我希望 getConnection() 方法只調用一次,並且每次迭代都會重用連接 object。 但是每次迭代都會調用 getConnection() 方法,這會導致無效結果。 也正因為如此,我無法評估 executeQuery() 性能。

請有人提供有關我如何解決此問題的見解。

在 JMH 中,您應該將所有初始化例程保存在使用@Setup注釋的方法中,請參見 JMH 示例中的示例: https://github.com/openjdk/jmh/blob/master/jmh-samples/src/main/java/org/ openjdk/jmh/samples/JMHSample_05_StateFixtures.java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM