1

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

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

要求是创建一个文件,其中包含查询以及旁边打印的响应时间。

此外

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

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

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

4

1 回答 1

1

你的问题太模糊了。
例如,您是否有例如 1000 个 SQL 传递给 SQL 服务器以作为批处理执行?
在这种情况下,您可以这样做:

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。也许已经有一个性能工具可以做到这一点

于 2012-08-07T16:36:07.577 回答