如何为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(); } }
解决方案
要实现基准测试,核心是记录文件删除事件的触发时间,以及数据库完成该文件导入的确认时间,两者的差值即为实际耗时。同时可优化轮询逻辑,避免无效查询,提升统计准确性。
具体实现方案
- 捕获文件删除事件时,立即记录起始时间戳;
- 循环调用数据库查询方法,直到确认目标文件的导入状态为完成(需调整
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)){ 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
相关产品推荐
相关产品推荐

