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.
Nel programma vero e proprio, è il logger dichiarato static finale in modo tale che non possa essere garbage collection? – jmehrens
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). –
Sono riuscito a creare un file .mdb (danneggiato) che ricrea il problema e lo ha segnalato al team di sviluppo UCanAccess. –