2015-12-20 9 views
5

Sto utilizzando UCanAccess per manipolare un database di Access. Quando si chiama executeUpdate ottengo l'eccezione:L'eccezione UCanAccess/Jackcess quando si chiama executeUpdate disabilita l'uscita del mio Logger

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 imprevisto tipo di pagina 1 (Db = db.accdb; Tabella = MyTable; Index = PrimaryKey)

Si verifica solo quando si tenta di aggiornare una riga specifica: so già come risolvere questo problema nel DB di accesso.

Il problema è con il Logger, dopo che questa eccezione è stata lanciata e io la prendo, registro un messaggio informativo e non viene mostrato, tutti i successivi messaggi di registro non vengono mostrati.

Il motivo per cui voglio correggerlo senza correggere il DB è perché quando si verifica una volta, l'utente deve chiudere l'applicazione per registrare le azioni successive, se non lo fa non potrò sapere cosa ha fatto.

Questo è il mio codice:

public static void main(String args[]) { 
    Logger logger = Logger.getLogger("myLogger"); 
    PreparedStatement pst = null; 
    try { 
     FileHandler fileHandler = new FileHandler("myLog.log", 0, 1, true); 

     // Set formatter to put the time, the message, and the exception if exists 
     fileHandler.setFormatter(new Formatter() { 
      @Override 
      public String format(LogRecord record) { 
       Throwable t = record.getThrown(); 
       String stackTrace = ""; 
       if (t != null) { 
        StringWriter sw = new StringWriter(); 
        t.printStackTrace(new PrintWriter(sw)); 
        stackTrace = sw.toString(); 
       } 

       return Calendar.getInstance().getTime() + "--" + 
         formatMessage(record) + stackTrace + "\n"; 
      } 
     }); 

     // Set the logger handler 
     logger.addHandler(fileHandler); 
     logger.log(Level.INFO, "1"); 

     // Throw on purpose 
     String query = "UPDATE myTable SET name = 'a' WHERE id = 289"; 

     conn = DriverManager.getConnection(DB_URL); 
     pst = conn.prepareStatement(query); 
     pst.executeUpdate(); 

     logger.log(Level.INFO, "2"); 
    } catch (UcanaccessSQLException e) { 
     logger.log(Level.INFO, "3"); 
     System.out.println("INSIDE Exception"); 
    } catch (SQLException e) { 
     logger.log(Level.INFO, "4"); 
    } catch (Exception e) { 
     logger.log(Level.INFO, "5"); 
    } 
} 

L'uscita della console è:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 imprevisto tipo di pagina 1 (Db = db accdb; Tabella = myTable; N = PrimaryKey) a net.ucanaccess.commands.CompositeCommand.persist (CompositeCommand.java:95) a net.ucanaccess.jdbc.UcanaccessConnection.flushIO (UcanaccessConnection.java:315) a rete .ucanaccess.jdbc.UcanaccessConnection.commit (Ucanacce ssConnection.java:205) a net.ucanaccess.jdbc.AbstractExecute.executeBase (AbstractExecute.java:161) a net.ucanaccess.jdbc.ExecuteUpdate.execute (ExecuteUpdate.java:50) a net.ucanaccess.jdbc. UcanaccessPreparedStatement.executeUpdate (UcanaccessPreparedStatement.java:253) a rashi.NewClass.main (NewClass.java:61) Causato da: java.io.IOException: Tipo di pagina imprevisto 1 (Db = db.accdb; Table = myTable; Index = PrimaryKey) a com.healthmarketscience.jackcess.impl.IndexData.isLeafPage (IndexData.java:1185) a com.healthmarketscience.jackcess.impl.IndexData.readDataPage (IndexData.java:1067) a com.healthmarketscience.jackcess .impl.IndexPageCache.readDataPage (IndexPageCache.java:267) su com.healthmarketscience.jac kcess.impl.IndexPageCache.getDataPage (IndexPageCache.java:224) in com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage (IndexPageCache.java:211) ..............

Eccezione ALL'INTERNO

e il file log contiene solo questa riga:

Sun Dec 20 15:35:40 IST 2015--1 

il che significa che il mio registratore non è più attivo. Immagino che ci siano alcune modifiche al logger prima dell'eccezione in UCanAccess.

+0

Nel programma vero e proprio, è il logger dichiarato static finale in modo tale che non possa essere garbage collection? – jmehrens

+0

il mio programma attuale contiene il logger finale statico. Ho creato un file db di accesso con quell'eccezione, lo caricherò in seguito. Nel frattempo, qualche suggerimento per l'utilizzo di un altro database compatto, che non richiederà grandi cambiamenti nel codice? Non voglio che questi errori vengano quando l'applicazione è in produzione (poiché ho provato a "compattare e riparare" e sono state eliminate molte righe). –

+0

Sono riuscito a creare un file .mdb (danneggiato) che ricrea il problema e lo ha segnalato al team di sviluppo UCanAccess. –

risposta

1

Sembra un effetto collaterale HSQLDB che si verifica mentre UCanAccess esegue un rollback fisico e chiude il mirror db.

L'impostazione della proprietà di sistema hsqldb.reconfig_logging a false può risolvere il problema, ad es.,

-Dhsqldb.reconfig_logging=false 

o

System.setProperty("hsqldb.reconfig_logging", "false"); 
+0

System.setProperty ("hsqldb.reconfig_logging", "false"); ha risolto il mio problema. quando imposto questa proprietà, il mio registratore continua a scrivere i suoi messaggi. Grazie! –

+0

Potrei impostare questo come predefinito, ma prima di tutto voglio essere sicuro che non porterà ad alcun effetto collaterale. – jamadei

Problemi correlati