[英]java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Connection
[英]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.Connection
, Statement
和ResultSet
之類的外部資源,也不能將其屬性作為類的實例變量。 您應該在本地方法范圍內盡快獲取,使用和關閉它們。 除去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.