2015-12-20 69 views
5

私はUCanAccessを使用してAccessデータベースを操作しています。 executeUpdateを呼び出すとき、私は例外を取得:executeUpdateを呼び出すとUCanAccess/Jackcess例外が発生し、Logger出力が無効になる

net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.2予期しないページ・タイプ1(DB = db.accdb;表= MyTableと、インデックス=主キー)

特定の行を更新しようとしているときにのみ発生します。この問題をAccess DBで解決する方法はすでにわかっています。

この問題は、この例外がスローされて捕捉された後、情報メッセージを記録し、表示されず、次のログメッセージも表示されません。

私は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.UcanaccessSQLException:UCAExc ::: 3.0.2予期しないページ・タイプ1(DB =デシベル.accdb;テーブル= myTable;インデックス= 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(Ucanacce ssConnection.java:205) at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:161) at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50) at net.ucanaccess.jdbc。 UMCaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:253) at rashi.NewClass.main(NewClass.java:61) 原因:java.io.IOException:予期しないページ・タイプ1(Db = db.accdb; Table = myTable;索引= PrimaryKey) com.healthmarketscience.jackcess.impl.IndexData.isLeafPage(IndexData.java:1185) com.healthmarketscience.jackcess.impl.IndexData.readDataPage(IndexData.java:1067) at com.healthmarketscience.jackcess .impl.IndexPageCache.readDataPage(IndexPageCache.java:267) at com.healthmarketscience.jac kcess.impl.IndexPageCache.getDataPage(IndexPageCache.java:224) com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage(IndexPageCache.java:211) ..............

INSIDE例外

そして、私のログファイルには、これだけの行が含まれています

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

私のロガーは、もはや有効であることを意味しないいます。 UCanAccessの例外の前にいくつかのロガーの変更があると思います。

+0

、ロガーは、それがゴミを収集することができないように、最終的な静的宣言しているのですか? – jmehrens

+0

私の実際のプログラムには静的最終ロガーが含まれています。 この例外を指定してアクセスデータベースファイルを作成しましたが、後でアップロードします。一方、コードの大きな変更を必要としない別のコンパクトなデータベースを使用するための任意の提案は?私はアプリケーションが生産中のときにこれらのエラーが発生しないようにしたい(私は "コンパクトで修復"を試み、多くの行が削除されているので)。 –

+0

問題を再現し、UCanAccess開発チームに報告した(破損した).mdbファイルを作成できました。 –

答えて

1

UCanAccessが物理的なロールバックを実行してミラーdbをシャットダウンしている間に発生するHSQLDBの副作用のようです。

hsqldb.reconfig_loggingfalseに設定すると、問題が解決する場合があります。、

-Dhsqldb.reconfig_logging=false 

たり、実際のプログラムで

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

System.setProperty( "hsqldb.reconfig_logging"、 "false");私の問題を解決しました。このプロパティを設定すると、ロガーはメッセージを書き続けます。ありがとう! –

+0

私はこれをデフォルトに設定するかもしれませんが、これまでに何らかの副作用が起きることはありません。 – jamadei

関連する問題