私は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の例外の前にいくつかのロガーの変更があると思います。
、ロガーは、それがゴミを収集することができないように、最終的な静的宣言しているのですか? – jmehrens
私の実際のプログラムには静的最終ロガーが含まれています。 この例外を指定してアクセスデータベースファイルを作成しましたが、後でアップロードします。一方、コードの大きな変更を必要としない別のコンパクトなデータベースを使用するための任意の提案は?私はアプリケーションが生産中のときにこれらのエラーが発生しないようにしたい(私は "コンパクトで修復"を試み、多くの行が削除されているので)。 –
問題を再現し、UCanAccess開発チームに報告した(破損した).mdbファイルを作成できました。 –