0

私は現在、Web スクレイピングを実装する Java プロジェクトに取り組んでおり、これまでのところ奇妙な問題に直面しています。

これが私がすることです:

  1. Web サイトのページとの URL 接続を取得する
  2. HTML コードを解析してコンテンツを取得する (OpenData)
  3. データベースにコンテンツを追加する
  4. 次のページに移動し、ステップ 1 に戻ります

これは実際には非常に長く、何日も続く可能性があるため、スクリプトを実行する必要があります。問題は、理由もなく停止する場合があることです (エラー、メッセージ、ウィンドウが閉じません。文字通り停止するだけで、ボタンの 1 つを押して再起動する必要があります)。アプリケーションを停止した場所から再起動する短いコードを実装しました。データベースへの接続の問題だと思うので、どうすれば修正できるか知りたいです。

アプリケーションの開始時にこのクラスのインスタンスを作成する静的クラスを使用し、次にこのクラスの静的メソッドを使用して、たとえば次のようにクエリを実行します。

    ConnexionBDD.con.prepareStatement(query);

public static Connection loadDriver() {
 try {
     Class.forName(Driver);
     con = DriverManager.getConnection(ConnectionString, user, pwd);
     } catch (ClassNotFoundException e) {
    System.err.println("Classe not found : Class.forName(...)");
} catch (SQLException e) {
    System.err.println(e.getMessage());
}
return con;
}

接続を(理論的には)永遠に持続させ、リンクの反復処理が終了したときに最終的に接続を閉じるために正しいことを行っているかどうかはわかりません。

4

1 に答える 1

1

ここで銃を少しジャンプしています。データベース接続が実際に問題であるという証拠はありません。通常、DB 接続に問題がある場合、操作を実行しようとすると接続から例外が発生したり、タイムアウトなどが発生したりします。

必要がある:

  • アプリケーションに詳細なログを追加して、アプリケーションが進行中に何をしているか、停止時に何をしようとしているのかを確認できます。と

  • およびリモート デバッグ用のその他の適切なオプションを使用して実行すると-Xdebug、停止時にデバッガをアタッチし、その状態を調べて、その時点で何を行っているかを確認できます。進行が停止したことがログに示されている場合は、NetBeans、Eclipse、またはプログラムにアタッチしたいものから、デバッガーのユーザー インターフェイスを使用します。

ロギングには、 を使用できますjava.util.loggingjavadocおよびロギングの概要ドキュメントを参照してください。

Eclipse でリモート デバッグを行う方法の例を次に示します。選択した IDE の同様のガイドを見つけることができます。Java にもコマンドライン デバッガーがありますが、かなり面倒です。

また、単に動作を停止するのではなく、プログラムがクラッシュまたは終了する可能性があるかどうかを確認する必要があります。プログラムからの標準エラー出力をキャプチャし、シェルからのプログラムのエラー リターン コードをチェックする必要があります。hs_errorまた、JVM クラッシュが発生した場合に備えて、プログラムが実行されているディレクトリ内のファイルを探しますが、stderr にも出力が生成されるはずです。

次のことも行う必要があります。

  • PostgreSQL への接続を確立するときに を設定するapplication_nameと、クライアントがデータベースで何をしているかを簡単に確認できます。application_nameJDBC 接続パラメーターとして指定するか、SET application_name = 'blah'接続後にステートメントを実行できます。

  • ロギング (または現在プログラムが進行していないことを現在伝えている) が、プログラムが動作を停止したことを示している場合pg_stat_activityは、サーバーを調べて、アプリケーションのエントリを調べます。接続がidleidle in transaction、またはステートメントを実行しているかどうか、およびそのステートメントが何であるかを確認します。ステートメントを実行している場合は、クエリを実行しpg_locksて、付与されていないロックでブロックされているかどうかを確認します。

于 2013-07-25T09:07:03.413 に答える