2016-11-23 6 views
1

jdbcを初めて使用し、前に書いたSQLクエリを含むファイルから読み込みます。クエリは適切に実行され、私のプログラムは明らかな問題がなくなりますが、statement.executeBatch();の後は、もうログに何も書き込めません。jdbcを使用中にログに記録する

- 私はを使用してFileHandlerでログを記録しています。私の ".sql"ファイルを読むために、私はBufferedReaderFileReaderを使用しています。私は文脈を完全に理解するために多くのコードを共有しているわけではないことを知っていますが、それは私がメモリから得たものです。私は使用後にすべての読者を閉じています。

何が問題なのでしょうか?

MyLogger.log(Level.WARNING, "it does write"); 
statement.executeBatch(); 
MyLogger.log(Level.WARNING, "it doesn't write anymore"); 
statement.close(); 
MyLogger.log(Level.WARNING, "still doesn't"); 

おかげ

編集:statigログ方法と MyLoggerがクラスである

EDIT2: @Tim Biegeleisen statement.executeBatch() intの配列、各バッチのための1つを返します。私は試しました:

try { 
      int[] results = statement.executeBatch(); 
      for (int result : results) 
      { 
       if (result == Statement.EXECUTE_FAILED) 
       { 
        MyLogger.log(Level.SEVERE, "batch failed, but driver seems to still be alive."); 
        System.out.println("batch failed, but driver seems to still be alive."); 
       } 
      } 

     } catch (SQLException e) { 
      MyLogger.log(Level.SEVERE, "the batch failed, and the driver died too."); 
      System.out.println("the batch failed, and the driver died too."); 
     } 

それは印刷され、何も記録されませんでした。

edit3:私は、シャットダウンフックをあまりにも多く求めていたと思います。私はそれに精通していないので、正確に何が問題だったのか分かりません。

+0

MyLoggerとは何ですか?それはロガーの(ひどい名前の)インスタンスですか、それとも静的ログメソッドを含むクラスですか?クラスの場合は、少なくともそのクラスのコードを投稿する必要があります。 – haggisandchips

+0

...とロギング設定。 – haggisandchips

+0

私はあなたに幾分投機的な答えをくれましたが、少なくともあなたはいくつかの可能な説明を除外させます。 –

答えて

0

私に最もよく似ている説明は、あなたのコードがexecuteBatch()を打つと転がっているということです。この後、ロガーへの後続の呼び出しは、まったくヒットしていないため動作していないように見えます。これをテストする簡単な方法は、try catchブロックでexecuteBatch()への通話を囲むように、次のようになります。

try { 
    int result = statement.executeBatch(); 
    if (result == Statement.EXECUTE_FAILED) { 
     MyLogger.log(Level.ERROR, "batch failed, but driver seems to still be alive."); 
    } 
} catch (SQLException e) { 
    MyLogger.log(Level.ERROR, "the batch failed, and the driver died too."); 
} 
+0

私のログファイルに書き込まないのはmyLoggerだけです。残りのコードは正常に動作しています。壊れたMyLogger.log( 'bla')の前後にアラートを使用しています。 –

+0

いずれにしても、チャンスがあったときにこのコードを実装してください。例外がなくても、あなたはEXECUTE_FAILEDレスポンスを得ている可能性があります。私はこのコード行で_something_が起きていると仮定します。私は一度それを排除することができますこれを削除します。 –

+0

確かに、私は午前中にまず事をするでしょう。 –

0

私は私が私のシャットダウンフックのあまりを求めていたと思います。私はそれに精通していないので、正確に何が問題なのかは分かりません。

参照:LogManager$Cleaner() can prevent logging in other shutdown hooks シャットダウンフックでロギングを実行しようとすると、LogManager $ Cleanerスレッドで競合しています。

カスタムシャットダウンフックを作成するための回避策として、カスタムハンドラを作成してルートロガーにインストールすることができます。 LogManager $ Cleanerの最初の動作は、ロガーにインストールされているすべてのハンドラを閉じることです。

  1. 持ってLogManager $クリーナーは、ハンドラ内であなたのシャットダウンのコードを実行します。クリーナー一度 あなたは、次のいずれかを実行できるカスタムハンドラに近いを呼び出します。
  2. Thread APIjoinを使用してカスタムシャットダウンフックを見つけ、クリーナースレッドをブロックします。
+0

情報ありがとうございます;将来的には貴重かもしれない。 –

関連する問題