调用executeUpdate时出现UCanAccess/Jjaccess异常,将禁用我的Logger输出



我正在使用UCanAccess来操作Access数据库。当调用executeUpdate时,我得到异常:

net.ucanaccess.jdbc.UcanaccessSQL异常:UCAExc::3.0.2意外的页面类型1(Db=Db.accdb;Table=MyTable;Index=PrimaryKey)

它只在尝试更新一个特定行时发生——我已经知道如何在Access DB中修复它了。

Logger的问题是,在引发此异常并捕捉到它之后,我会记录一条信息消息,但它不会显示,接下来的所有日志消息也不会显示。

我之所以想在不修复DB的情况下修复它,是因为当它发生一次时,用户应该关闭应用程序以记录下一次操作,如果他不这样做,那么我将无法知道他做了什么。

这是我的代码:

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

控制台输出为:

net.ucanaccess.jdbc.UcanaccessSQL异常:UCAExc::3.0.2意外的页面类型1(Db=Db.accdb;Table=myTable;Index=PrimaryKey)位于net.ucancess.commands.CompositeCommand.spersistent(CompositeCommand.java:95)位于net.ucanaccess.jjdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315)位于net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205)位于net.ucancess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:161)在net.ucancess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50)位于net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccesspreparedStatements.java:253)在拉希。NewClass.main(NewClass.java:61)引起原因:java.io.IOException:意外的页面类型1(Db=Db.accdb;Table=myTable;Index=PrimaryKey)网址:com.healthmarketscience.jjaccess.impl.IndexData.isLeafPage(IndexData.java:1185)网址:com.healthmarketscience.jjaccess.impl.IndexData.readDataPage(IndexData.java:1067)网址:com.healthmarketscience.jjaccess.impl.IndexPageCache.readDataPage(IndexPageCache.java:267)网址:com.healthmarketscience.jjaccess.impl.IndexPageCache.getDataPage(IndexPageCache.java:224)网址:com.healthmarketscience.jjaccess.impl.IndexPageCache.getCacheDataPage(IndexPageCache.java:211)………….

内部异常

我的日志文件只包含这一行:

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

这意味着我的记录器不再活动。我想在UCanAccess异常之前有一些记录器更改。

这看起来像是在UCanAccess进行物理回滚并关闭镜像数据库时发生的HSQLDB副作用。

将系统属性hsqldb.reconfig_logging设置为false可以解决问题,例如

-Dhsqldb.reconfig_logging=false

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

相关内容

  • 没有找到相关文章

最新更新