You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为XML导入SQL表的Java监控代码添加SQL更新计时基准测试

问题:为XML文件导入SQL表的性能添加Java基准测试逻辑

我需要编写用于测试XML文件导入SQL表性能的Java基准测试代码,目前已经写了一段监控指定文件夹的Java代码,当检测到文件删除事件时,会调用SqlUtils的checkFileImport方法从数据库获取状态。现在要在这段代码里添加基准测试逻辑,追踪文件更新到数据库的耗时,该怎么实现?

现有代码如下:

import java.io.IOException;
import java.nio.file.*;
import java.util.HashMap;
import java.util.List;

public class Application extends SqlUtils {

    private static String folderPath = "D:\\EntityImportEversana";

    public static void main(final String[] args) throws IOException, InterruptedException {

        System.out.println("Running file verifier");
        System.out.println("monitoring folder " + folderPath);
        SqlUtils sql = new SqlUtils();

        WatchService watchService = FileSystems.getDefault().newWatchService();
        Path path = Paths.get(folderPath);
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
        WatchKey key;
        while ((key = watchService.take()) != null) {
            for (WatchEvent<?> event : key.pollEvents()) {
                System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
                if(event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE)){
                    // Here we make a constant pull and we get the status using sql from db.
                    // make here start of benchmark 
                    HashMap<String, List> map = sql.checkFileImport();

                    // end here of benchmark

                }

            }
            key.reset();
        }

        watchService.close();
    }
}
解决方案

要实现基准测试,核心是记录文件删除事件的触发时间,以及数据库完成该文件导入的确认时间,两者的差值即为实际耗时。同时可优化轮询逻辑,避免无效查询,提升统计准确性。

具体实现方案

  1. 捕获文件删除事件时,立即记录起始时间戳;
  2. 循环调用数据库查询方法,直到确认目标文件的导入状态为完成(需调整checkFileImport支持按文件名精准查询);
  3. 确认完成后记录结束时间,计算并输出耗时,也可将数据持久化用于后续分析。

修改后的代码示例

import java.io.IOException;
import java.nio.file.*;
import java.util.HashMap;
import java.util.List;

public class Application extends SqlUtils {

    private static String folderPath = "D:\\EntityImportEversana";

    public static void main(final String[] args) throws IOException, InterruptedException {

        System.out.println("Running file verifier");
        System.out.println("monitoring folder " + folderPath);
        SqlUtils sql = new SqlUtils();

        WatchService watchService = FileSystems.getDefault().newWatchService();
        Path path = Paths.get(folderPath);
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
        WatchKey key;
        while ((key = watchService.take()) != null) {
            for (WatchEvent<?> event : key.pollEvents()) {
                System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
                if(event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE)){
                    String targetFile = event.context().toString();
                    // 记录基准测试起始时间
                    long startTime = System.currentTimeMillis();
                    System.out.println("开始追踪文件 [" + targetFile + "] 的导入耗时");

                    // 轮询数据库直到确认导入完成
                    boolean importDone = false;
                    HashMap<String, List> importStatus;
                    while (!importDone) {
                        // 建议修改checkFileImport方法,支持传入文件名精准查询状态
                        importStatus = sql.checkFileImport(targetFile);
                        // 假设返回的map中包含"status"字段,值为"COMPLETED"表示导入完成
                        if (importStatus != null && "COMPLETED".equals(importStatus.get("status"))) {
                            importDone = true;
                        } else {
                            // 避免高频查询,添加500ms间隔
                            Thread.sleep(500);
                        }
                    }

                    // 计算并输出耗时
                    long endTime = System.currentTimeMillis();
                    long elapsedMs = endTime - startTime;
                    System.out.println("文件 [" + targetFile + "] 导入完成,耗时:" + elapsedMs + " ms");
                    // 可选:将耗时写入日志或存储到数据库做性能分析
                }

            }
            key.reset();
        }

        watchService.close();
    }
}

关键细节说明

  • 精准查询:必须修改SqlUtils.checkFileImport方法,支持传入文件名参数,否则无法对应到具体文件的导入状态;
  • 轮询间隔:添加Thread.sleep避免短时间内频繁查询数据库,减少资源消耗,间隔时长可根据实际导入速度调整;
  • 时间精度:如果需要更高精度的统计,可替换System.currentTimeMillis()为System.nanoTime(),最后转换为毫秒或微秒;
  • 数据持久化:可以将每次的耗时数据写入本地日志文件或专门的性能统计数据表,方便后续计算平均耗时、最大/最小耗时等指标。

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:01:08