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

时间:2011-10-13 13:52:40

标签: java jsf jdbc

我有一个带有视图范围的托管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).........

但是当我将范围更改为会话或请求时,一切正常。 任何人都可以告诉我,如果我做错了什么?也许我忘记了配置或什么?

1 个答案:

答案 0 :(得分:5)

您已将JDBC Connection指定为视图作用域托管bean的属性。查看作用域的托管bean及其所有属性需要可序列化,因为它们将存储在会话中。但是Connection接口不会扩展Serializable,因此会出现此异常。您需要将其设为transient

真正的问题实际上更大;将外部资源作为一个类的领域是一个非常糟糕的主意。您永远不应该将DB资源保存为类的字段,该类的字段比资源需要保持打开的时间更长。否则它们将泄漏和/或将导致线程安全和事务性问题(死锁等)和/或将由DB回收并因此停止工作。

您应始终打开和关闭最短范围内的连接(以及语句和结果集),最好是在同一方法块的try-finally块内。如果要提高连接性能,则应使用连接池。

另见: