簡體   English   中英

java.io.NotSerializableException:com.mysql.jdbc.DatabaseMetaData

[英]java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData

我正在使用JSF 1.2,並嘗試使用<a4j:keepAlive beanName="reportController"> ,但是我一直收到此錯誤:

HTTP狀態500

造成原因:java.io.NotSerializableException:com.mysql.jdbc.DatabaseMetaData at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183

我嘗試使用<a4j:keepAlive beanName="reportController">因為當我搜索特定的報表然后嘗試對dataTable中的數據進行排序時,似乎丟失了dataTable中的所有數據。

引起原因:java.io.NotSerializableException:com.mysql.jdbc.DatabaseMetaData

當您擁有java.sql.Connection或什至直接將DatabaseMetaData作為可序列化類的實例變量時,就會發生這種情況,如下所示。

public class ReportController implements Serializable {

    private Connection connection; // BAD!!
    private DatabaseMetaData metadata; // BAD!!

    // ...
}

您不應該聲明和獲取諸如java.sql.ConnectionStatementResultSet之類的外部資源,也不能將其屬性作為類的實例變量。 您應該在本地方法范圍內盡快獲取,使用和關閉它們。 除去ReportController bean中的那些實例變量,將它們移到方法本地作用域中,此問題將消失。 僅將DataSource (服務器管理的連接池)作為實例變量是可以的。

public class ReportController implements Serializable {

    @Resource("jdbc/someDB")
    private DataSource dataSource;

    public void someMethod() {
        try (Connection connection = dataSource.getConnection()) { // OK.
            // ...
        }
    }

    // ...
}

<a4j:keepAlive>並非正是此問題的原因。 它只是記住同一頁面上的HTTP回發請求中的HTTP會話中的bean實例。 HTTP會話屬性通常固有地被序列化。 這種序列化僅觸發並暴露了您隱藏的設計問題。 諸如數據庫連接,語句,元數據,輸入流,輸出流等易失的一次性使用資源絕對不應該序列化,因此是該異常。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM