Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.io.NotSerializableException:org.postgresql.jdbc4.jdbc4连接_Java_Jsf_Jdbc - Fatal编程技术网

java.io.NotSerializableException:org.postgresql.jdbc4.jdbc4连接

java.io.NotSerializableException:org.postgresql.jdbc4.jdbc4连接,java,jsf,jdbc,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.ObjectOutputStre

我有一个具有视图范围的托管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
连接作为视图范围的托管bean的属性分配。视图范围的托管bean及其所有属性都需要可序列化,因为它们将存储在会话中。但是,该接口不扩展可序列化的
,因此存在此异常。您需要使其成为瞬态的

但真正的问题其实更大;将外部资源作为类的一个字段是一个非常糟糕的主意。决不能将DB资源作为类的字段保存,因为该类的生存时间超过了资源需要保持打开的时间。否则,它们将泄漏和/或导致线程安全和事务性问题(死锁等),和/或将被DB回收,从而停止工作

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

另见:

您已将JDBC
连接分配为视图范围的托管bean的属性。视图范围的托管bean及其所有属性都需要可序列化,因为它们将存储在会话中。但是,该接口不扩展可序列化的
,因此存在此异常。您需要使其成为瞬态的

但真正的问题其实更大;将外部资源作为类的一个字段是一个非常糟糕的主意。决不能将DB资源作为类的字段保存,因为该类的生存时间超过了资源需要保持打开的时间。否则,它们将泄漏和/或导致线程安全和事务性问题(死锁等),和/或将被DB回收,从而停止工作

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

另见: