繁体   English   中英

如何捕获Java中同时执行多个查询的响应时间?

[英]How to go capture the response time of executing multiple queries simultaneously in Java?

我正在开发Java工具,该工具必须将包含一组查询(大约1000个)的文本文件作为输入,一起执行它们,并打印出每个查询所花费的响应时间。

我认为我们需要为此使用线程。 我们如何去做? 我们应该先创建一个连接,然后为每个查询启动一个新线程吗?

要求是创建一个包含查询以及响应时间的文件。

另外

  1. 计划从主编获取DB连接,并将其与执行查询的查询一起传递给线程。 这是正确的方法吗?
  2. 由于它是一个文本文件,因此将所有查询存储在arraylist中,并将从while迭代器循环中调用线程。 还有更好的方法吗?
  3. 如何编写响应时间? 我应该将所有查询与时间一起存储,最后将其写入文本文件,还是应该在从线程执行每个查询后立即将其写入?

任何帮助将不胜感激。 谢谢

编辑:这是为性能团队开发的工具,用于在数据库中大约有1000个并发命中时检查查询的响应时间。

您的问题太含糊。
例如,您是否有将1000个SQL传递给SQL Server以便批量执行?
在这种情况下,您可以执行以下操作:

long start = System.currentTimeMillis();  
execute SQL script  
System.out.println("took:"+System.currentTimeMillis() - start); 

如果您有一系列的sql查询要作为与应用程序分开的操作运行,并且想要测量平均时间,则可以使用执行程序来提交任务,为每个任务添加时间(与上述类似),最后分割按完成的查询数量。

更新:
您可以为此使用线程池。
示例(省略的异常处理):

   Collection<Callable<Long>> sqlTasks = new ArrayList<Callable<Long>>();  
   sqlTasks.add(new Callable<Long>(){  

    @Override  
    public Long call() throws Exception {  
        long start = System.currentTimeMillis();  
        // DO SQL QUERY HERE   
        //return delay  
        return System.currentTimeMillis() - start;  
       }  
    });  
    //ADD MORE TO THE QUEUE 
    ExecutorService threadPool = Executors.newCachedThreadPool();  
    List<Future<Long>> results = threadPool.invokeAll(sqlTasks);  
    long totalDelay = 0;  
    for(Future<Long> delay:results){  
        System.out.println("Delay for task"+delay.get());  
        totalDelay += delay.get();  
    }  
    System.out.println("Average Delay per task"+totalDelay / sqlTasks.size());  

您将SQL查询添加到队列中,它们由线程池中线程执行,并且每个查询都返回其延迟。
但是,您还应该提及要尝试的SQL DB。 也许已经有一个性能工具

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM