UCanAccess/Jackcess exception when calling executeUpdate disables my Logger output

送分小仙女□ 提交于 2019-12-10 13:57:55

问题


I am using UCanAccess for manipulating an Access database. When calling executeUpdate I get the exception:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 Unexpected page type 1 (Db=db.accdb;Table=MyTable;Index=PrimaryKey)

It only occurs when trying to update one specific row - I already know how to fix this in the Access DB.

The problem is with the Logger, after this exception is thrown and I catch it, I log an info message and it is not shown, all of the next log messages are not shown either.

The reason why I want to fix it without fixing the DB is because when it occurs once, the user should close the application in order to log the next actions, if he doesn't then I will not be able to know what he did.

This is my code:

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

The console output is:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 Unexpected page type 1 (Db=db.accdb;Table=myTable;Index=PrimaryKey) at net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:95) at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315) at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205) at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:161) at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50) at net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:253) at rashi.NewClass.main(NewClass.java:61) Caused by: java.io.IOException: Unexpected page type 1 (Db=db.accdb;Table=myTable;Index=PrimaryKey) at com.healthmarketscience.jackcess.impl.IndexData.isLeafPage(IndexData.java:1185) at com.healthmarketscience.jackcess.impl.IndexData.readDataPage(IndexData.java:1067) at com.healthmarketscience.jackcess.impl.IndexPageCache.readDataPage(IndexPageCache.java:267) at com.healthmarketscience.jackcess.impl.IndexPageCache.getDataPage(IndexPageCache.java:224) at com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage(IndexPageCache.java:211) ..............

INSIDE Exception

And my log file contains only this row:

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

which means my logger is no longer active. I guess there are some logger changes before the exception in UCanAccess.


回答1:


It looks like an HSQLDB side-effect that happens while UCanAccess is doing a physical rollback and shutting down the mirror db.

Setting the system property hsqldb.reconfig_logging to false may solve the issue, e.g.,

-Dhsqldb.reconfig_logging=false

or

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


来源:https://stackoverflow.com/questions/34381687/ucanaccess-jackcess-exception-when-calling-executeupdate-disables-my-logger-outp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!