java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Connection - PullRequest
0 голосов
/ 13 октября 2011

У меня есть управляемый компонент с областью видимости.Проблема в том, что при запуске веб-приложения возникает следующая ошибка:

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 Ответ

5 голосов
/ 13 октября 2011

Вы назначили JDBC Connection в качестве свойства управляемого компонента. Просмотр управляемых bean-компонентов и всех его свойств должен быть сериализуемым, так как они будут храниться в сеансе. Однако интерфейс Connection не расширяет Serializable и, следовательно, это исключение. Вам нужно было бы сделать это transient.

Но проблема real на самом деле больше; удерживать внешние ресурсы как поле класса - крайне плохая идея. Никогда не следует хранить ресурсы БД как поле класса, который живет дольше, чем ресурс должен оставаться открытым. В противном случае они вытекут и / или вызовут проблемы безопасности потоков и транзакций (взаимоблокировки и т. Д.) И / или будут восстановлены БД и, таким образом, перестанут работать.

Вы всегда должны открывать и закрывать соединение (а также оператор и набор результатов) в кратчайшей возможной области действия , предпочтительно внутри блока try-finally того же самого блока метода. Если вы хотите улучшить производительность соединения, вам следует использовать пул соединений.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...