2015-12-20 12 views
5

Tôi đang sử dụng UCanAccess để thao tác với cơ sở dữ liệu Access. Khi gọi executeUpdate tôi nhận được ngoại lệ:UCanAccess/ngoại lệ xử lý khi gọi executeUpdate vô hiệu hóa đầu ra Logger của tôi

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 bất ngờ loại trang 1 (Db = db.accdb; Bảng = MyTable; Index = PrimaryKey)

Nó chỉ xảy ra khi cố gắng cập nhật một hàng cụ thể - Tôi đã biết cách khắc phục điều này trong DB truy cập.

Vấn đề là với Logger, sau khi ngoại lệ này được ném và tôi bắt nó, tôi đăng nhập một thông báo và nó không được hiển thị, tất cả các thông điệp tường trình tiếp theo cũng không được hiển thị.

Lý do tại sao tôi muốn sửa nó mà không sửa DB là vì khi nó xảy ra một lần, người dùng nên đóng ứng dụng để ghi lại các hành động tiếp theo, nếu không thì tôi sẽ không thể biết anh ấy đã làm gì.

Đây là mã của tôi:

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

Giao diện điều khiển đầu ra là:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 bất ngờ loại trang 1 (Db = db .accdb; Bảng = myTable; Index = PrimaryKey) tại net.ucanaccess.commands.CompositeCommand.persist (CompositeCommand.java:95) tại net.ucanaccess.jdbc.UcanaccessConnection.flushIO (UcanaccessConnection.java:315) tại net .ucanaccess.jdbc.UcanaccessConnection.commit (Ucanacce ssConnection.java:205) tại net.ucanaccess.jdbc.AbstractExecute.executeBase (AbstractExecute.java:161) tại net.ucanaccess.jdbc.ExecuteUpdate.execute (ExecuteUpdate.java:50) tại net.ucanaccess.jdbc. UcanaccessPreparedStatement.executeUpdate (UcanaccessPreparedStatement.java:253) tại rashi.NewClass.main (NewClass.java:61) Gây ra bởi: java.io.IOException: Loại trang không mong muốn 1 (Db = db.accdb; Table = myTable; Index = PrimaryKey) tại com.healthmarketscience.jackcess.impl.IndexData.isLeafPage (IndexData.java:1185) tại com.healthmarketscience.jackcess.impl.IndexData.readDataPage (IndexData.java:1067) tại com.healthmarketscience.jackcess .impl.IndexPageCache.readDataPage (IndexPageCache.java:267) tại com.healthmarketscience.jac kcess.impl.IndexPageCache.getDataPage (IndexPageCache.java:224) tại com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage (IndexPageCache.java:211) ..............

INSIDE Exception

Và tập tin đăng nhập của tôi chỉ chứa hàng này:

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

có nghĩa logger của tôi là không còn hoạt động. Tôi đoán có một số thay đổi logger trước khi ngoại lệ trong UCanAccess.

+0

Trong chương trình thực tế của bạn, là logger tuyên bố tĩnh thức như vậy mà nó không thể được thu gom rác thải? – jmehrens

+0

chương trình thực tế của tôi chứa nhật ký cuối cùng tĩnh. Tôi đã tạo tệp truy cập db với ngoại lệ đó, tôi sẽ tải nó lên sau. Trong khi đó, bất kỳ đề xuất nào để sử dụng một cơ sở dữ liệu nhỏ gọn khác, điều đó sẽ không yêu cầu những thay đổi lớn trong mã? Tôi không muốn các lỗi này xảy ra khi ứng dụng đang trong quá trình sản xuất (vì tôi đã cố gắng "nhỏ gọn và sửa chữa" và nhiều hàng đã bị xóa). –

+0

Tôi đã quản lý để tạo một tệp .mdb (bị hỏng) tái tạo sự cố của bạn và đã báo cáo sự cố với nhóm phát triển UCanAccess. –

Trả lời

1

Dường như một tác dụng phụ HSQLDB xảy ra trong khi UCanAccess đang thực hiện khôi phục vật lý và tắt db gương.

Đặt thuộc tính hệ thống hsqldb.reconfig_logging thành false có thể giải quyết vấn đề, ví dụ:,

-Dhsqldb.reconfig_logging=false 

hoặc

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

System.setProperty ("hsqldb.reconfig_logging", "false"); đã giải quyết được vấn đề của tôi. khi tôi đặt thuộc tính này, trình ghi nhật ký của tôi tiếp tục viết các thông điệp của nó. Cảm ơn! –

+0

Tôi có thể đặt cài đặt này làm mặc định, nhưng trước khi tất cả tôi muốn chắc chắn nó sẽ không dẫn đến một số tác dụng phụ. – jamadei

Các vấn đề liên quan