0

Selenium webdriver と firefox を使用して Web サイトをテストする Java の長いコードがあります。ここで再現できない場合はご容赦ください。その機能を繰り返し実行し続けるために、無限 while ループがあります。それがやるべきことです。また、マルチスレッドは使用しません。

  1. 時々、行き詰まります。私は Windows システムを使用しており、コードはコマンド プロンプトで実行されます。スタックしても、エラーや例外はスローされません。「ハングする」ようなものです (コードが実行されているウィンドウのみがハングします)。次に、 CTRL + C を使用する必要があります。その後、動作を再開することもあれば、終了して再起動することもあります。正常に動作しますが、いくつかのループの後、再び「ハング」します。また、通常、mysql データベースにクエリを実行するメソッドの 1 つを実行していることに気付きました。

  2. コードは無限ループを実行します。毎回、mysql データベースにクエリを実行し、特定のテーブル (各ループで 1 つの値) から値 (「ステータス」フィールドが「完了」していない) を取得し、この値を使用してテストを続行します。ループの最後で、テーブルが更新されます (列「ステータス」はその値に対して「完了」に設定されます)。その特定のテーブルに「ステータス」が「完了」と等しくない新しい値がない場合、理想的には「NO NEW VALUE」と表示する必要があります。ただし、すべての値が使用された後は、最後に使用された値が取り出され (前のループの最後でステータスが「完了」に更新されていても)、先に進みます。次に、実行を終了してコードを再度実行する必要があります。今回は無限ループが始まると、データベースにクエリを実行し、正しく「

con.close() を使用して SQL 接続を閉じます。

ループを数回実行した後、一部のリソースがどこかで使い果たされているようです。しかし、これは勝手な推測にすぎません。

誰が問題が何であるか、どうすれば修正できるかを提案できますか?

以下は関連するコードです:

try{
        String sql = "select something from somewhere where id = ? and          is_deleted = '0';";

        System.out.println("\n"+sql + "\n? = " + pID);

        PreparedStatement selQuery1 = conn.prepareStatement(sql);

        selQuery1.setString(1, pID);

        ResultSet rs1 = selQuery1.executeQuery();

        //Extract data from result set
        while(rs1.next() && i1<6){
            //do something


        }//end while loop

        String sql2 = "select something2 from somewhere2 where id = ? and is_deleted = '0';";
        System.out.println("\n"+sql2 + "\n? = " + pjID);


        PreparedStatement selQuery2 = conn.prepareStatement(sql2);
        selQuery2.setString(1, pjID);
        ResultSet rs2 = selQuery2.executeQuery();



        //Extract data from result set
        while(rs2.next() && i1<6){
            //do something

        }//end while loop

        System.out.println("\nDone.");

        conn.close();
    }catch (SQLException e) {
        flag=false;
}

例外はどこにもスローされないことに注意してください。両方のクエリステートメントを表示した後、コードが実行されているウィンドウがフリーズします (それもたまに) 。

4

2 に答える 2

1

クエリと結果セットを閉じるのを忘れました。接続を閉じるだけで、クエリと結果セットが暗黙的に閉じられるはずですが、常に機能するとは限りません。

于 2013-11-12T12:05:02.223 に答える
0

私も最近同じ問題に直面しました。しかし、私の場合、問題はインデックスにありました。他の人に役立つように、ここで指摘しているだけです。

私の場合、データベースの MenuMaster テーブルからメニュー項目を取得しています。ログインに成功したら、MySQL コネクタ ドライバを使用してデータベースにアクセスし、メニュー項目を取得しています。ここでは、親メニューとその子メニューを取得する必要があります。私のクエリでは、where 句で主キーまたは一意のキーを使用していません。だから、それは長い時間がかかりました。したがって、そのキーのインデックスを作成するだけで、魅力的に機能しました...

于 2016-02-25T09:45:27.093 に答える