1

私はJavaツールを開発しています。このツールは、一連のクエリ(約1000)を含むテキストファイルを入力として受け取り、それらを一緒に実行し、各クエリにかかった応答時間を出力する必要があります。

これにはスレッドを使用する必要があると思います。どうすればいいですか?最初に接続を作成してから、クエリごとに新しいスレッドを開始する必要がありますか?

要件は、クエリと応答時間が一緒に印刷されたファイルを作成することです。

さらに

  1. メインプログラムからDB接続を取得することを計画し、クエリが実行されるクエリと一緒にスレッドに渡します。これは正しい方法ですか?
  2. これはテキストファイルであるため、配列リスト内のすべてのクエリを取得し、whileイテレータループからスレッドを呼び出します。より良い方法はありますか?
  3. 応答時間をどのように書くのですか?すべてのクエリを時間とともに保存し、最後にテキストファイルに書き込む必要がありますか、それとも各クエリがスレッドから実行されるとすぐに書き込む必要がありますか?

どんな助けでも大歓迎です。ありがとう

編集:これは、パフォーマンスチームがDBに約1000の同時ヒットがある場合にクエリの応答時間をチェックするために開発されたツールです。

4

1 に答える 1

1

あなたの質問は曖昧すぎます。
たとえば、バッチとして実行するためにSQLサーバーに渡す1000の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クエリはスレッドプール内のスレッドによって実行され、それぞれが遅延を返します。
ただし、試行しているSQLDBについても言及する必要があります。おそらく、そのためのパフォーマンスツールはすでに存在します

于 2012-08-07T16:36:07.577 に答える