簡體   English   中英

java.io.NotSerializableException:org.postgresql.jdbc4.Jdbc4Connection

[英]java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Connection

我有一個具有視圖范圍的托管bean。 問題是,當我運行Web應用程序時,出現以下錯誤:

GRAVE: Error Rendering View[/login.xhtml]
java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Connection
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source).........

但是,當我將范圍更改為會話或請求時,一切正常。 誰能告訴我我做錯了什么嗎? 也許我忘記了配置或其他內容?

您已將JDBC Connection分配為視圖范圍的受管bean的屬性。 View作用域管理的Bean及其所有屬性都需要可序列化,因為它們將存儲在會話中。 但是, Connection接口不會擴展Serializable ,因此不會擴展此異常。 您需要使其transient

但是真正的問題實際上更大。 將外部資源作為課程的一個領域是一個絕妙的主意。 永遠不要將數據庫資源作為類的字段保存,該類的生存期比需要保持打開狀態的資源長。 否則,它們將泄漏出去和/或將引起線程安全和事務問題(死鎖等),並且/或者將被DB收回,從而將停止工作。

您應該始終在盡可能短的范圍內打開和關閉連接(以及語句和結果集),最好在完全相同的方法塊的try-finally塊內。 如果要提高連接性能,則應使用連接池。

也可以看看:

暫無
暫無

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

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