2016-11-23 5 views
1

Ich benutze jdbc zum ersten Mal und Lesen aus einer Datei, die SQL-Abfragen enthält, die ich zuvor schrieb. Obwohl die Abfragen ordnungsgemäß ausgeführt werden und mein Programm ohne offensichtliches Problem weitergeht, kann ich nach dem ich statement.executeBatch(); habe, nichts mehr in mein Protokoll schreiben.Logging-Problem bei der Verwendung von jdbc

-Ich verwende die java.util.logging, um meine Protokollierung mit einem FileHandler zu tun. Um meine ".sql" -Datei zu lesen, verwende ich eine BufferedReader und eine FileReader. Ich weiß, dass ich nicht viel Code teile, um den Kontext vollständig zu verstehen, aber das ist alles, was ich aus dem Gedächtnis habe. Ich schließe alle Leser nach dem Gebrauch.

Irgendwelche Ideen, was könnte das Problem sein?

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"); 

Dank

edit: MyLogger ist eine Klasse mit einer statig log Methode

edit2: @ Tim Biegeleisen statement.executeBatch() gibt einen Array von int, ein für jede Charge. Ich habe versucht:

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."); 
     } 

und es gedruckt und protokolliert nichts.

edit3: Ich denke, ich habe zu viel von meinem Shutdown Hook gefragt. Ich bin nicht vertraut damit, ich bin mir nicht sicher, was genau das Problem war.

+0

Was ist MyLogger? Ist es eine (schlecht benannte) Instanz eines Loggers oder ist es eine Klasse, die eine statische Log-Methode enthält? Wenn es sich um eine Klasse handelt, müssen Sie den Code für diese Klasse mindestens veröffentlichen. – haggisandchips

+0

... und Ihre Protokollierungskonfiguration. – haggisandchips

+0

Ich gab Ihnen eine Antwort, die etwas spekulativ ist, aber es wird Sie zumindest einige mögliche Erklärungen ausschließen lassen. –

Antwort

0

Die Erklärung, die mir am wahrscheinlichsten erscheint, ist, dass sich Ihr Code beim Drücken von executeBatch() überschlägt. Danach scheinen die nachfolgenden Aufrufe an den Logger nicht zu funktionieren, weil sie überhaupt nicht getroffen werden. Eine einfache Möglichkeit, dies zu testen wäre Ihren Anruf executeBatch() mit einem Try-Catch-Block zu umgeben:

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

Die Sache ist, es ist nur myLogger, die nicht in meine Protokolldatei schreibt. Der ganze Rest des Codes funktioniert gut, ich habe Warnungen vor und nach dem zerbrochenen MyLogger.log ('bla') benutzt und sie kommen gut an. –

+0

In jedem Fall, bitte implementieren Sie diesen Code, wenn Sie eine Chance haben. Selbst wenn es keine Ausnahme gibt, erhalten Sie möglicherweise eine "EXECUTE_FAILED" -Antwort, die den Tod des Loggers erklären könnte. Ich würde annehmen, dass etwas in dieser Codezeile passiert. Ich werde das löschen, sobald wir es ausschließen können. –

+0

Sicher, ich werde als erstes am Morgen. –

0

Ich glaube, ich war zu viel verlangt von meinem Shutdown-Hook. Ich bin nicht vertraut damit, also bin ich mir nicht sicher, was genau das Problem war.

Siehe: LogManager$Cleaner() can prevent logging in other shutdown hooks. Wenn Sie versuchen, einen Herunterfahren-Hook zu protokollieren, fahren Sie mit dem LogManager $ Cleaner-Thread.

Als Workaround zum Erstellen eines benutzerdefinierten Shutdown-Hooks können Sie einen benutzerdefinierten Handler erstellen und auf dem Stammlogger installieren. Die erste Aktion des LogManager $ Cleaner besteht darin, alle installierten Handler auf dem Logger zu schließen. Sobald der Reiniger ruft die nahe an der benutzerdefinierten Handler Sie dann eine der folgenden Möglichkeiten:

  1. Have LogManager $ Reiniger Ihre Shutdown-Code innerhalb des Handlers ausgeführt werden.
  2. Finden Sie Ihren benutzerdefinierten Shutdown-Haken mit den Thread API und join damit, die den saubereren Thread blockieren wird.
+0

Danke für die Info; das könnte in der Zukunft wertvoll sein. –

Verwandte Themen