Неожиданный ResultSet является закрытым исключением в веб-приложении Spring - PullRequest
1 голос
/ 30 июля 2011

У нас есть подпружиненный компонент, который загружает сообщения приложений из базы данных Postgresql (8.4) при запуске.Определение бина похоже на:

Код довольно прост:

get a connection (we are using a dbcp pool)
Create a statement (plain jdbc, nothing special)
execute the query, get the result set
while(resultSet.next())){
    cacheMap.put(resultSet.getString("column1"), resultSet.getString("column2"));       
}

Код иногда генерирует закрытое исключение ResultSet внутри цикла while при запуске приложения.Он отлично работает без каких-либо исключений при использовании Postgresql 8.4.2, но выдает исключения большую часть времени (не всегда) при использовании Postgresql 8.4.8.
Мы тестировали его на 4 разных компьютерах с сервером Windows 7 или 2008, Tomcat6.0.32, последние версии Java 1.6, все серверы баз данных работают на одном компьютере.Результирующий набор содержит около 8000 строк (два столбца; символ меняется (200) и символ меняется (1000)).Что здесь может быть не так?

  • Возможно ли, что пул закрывает соединение или повторно использует его, прежде чем мы закончим обработку набора результатов?
  • Или это может быть связано с версиями базы данных?

Кстати, мы изменили код для загрузки сообщений, когда они используются в первый раз вместо запуска приложения, и он работает нормально.Так что это исключение возникает только тогда, когда код вызывается при запуске, используя init-метод.

Заранее спасибо

1 Ответ

0 голосов
/ 04 августа 2011

Сначала я подумал, что вы можете использовать контейнерный компонент Spring до того, как он будет полностью инициализирован.Иногда это может привести к противоречивому поведению (вещи могут не инициализироваться в том же порядке, когда происходит изменение конфигурации или библиотеки).Ваш последний абзац также указывает на проблемы инициализации зависимостей.

Spring использует ref-соединения, чтобы решить, какие bean-компоненты должны быть инициализированы первыми.Но если ваш метод init обращается к контейнерным bean-компонентам (а не использует встроенные bean-компоненты), Spring об этом не знает, и вы можете получить доступ к bean-компоненту, который был создан, но еще не инициализирован.Кэши и статические инициализаторы кажутся типичными кандидатами для такого рода скорби.

Ваше решение перенести действия по созданию кэша на время после сборки контейнера Spring кажется мне хорошим решением.Если это проблема инициализации зависимости, и вы можете догадаться, какой компонент не завершен (скажем, пул соединений), вы можете использовать «зависимость от» в конфигурации вашего компонента, чтобы сначала инициализировать другой компонент.

Если это проблема инициализации, то я ожидаю, что когда вы получите исключение «набор результатов закрыт», оно всегда будет при первом обращении к оператору while (resultSet.next ())), и у вас ничего не будет в вашемкэш.Либо вещи не инициализированы должным образом, и это происходит сразу же, либо вещи действительно инициализировались правильно, и ваш кэш заполняется.Если кэш заполнен частично и ошибка набора результатов происходит частично при чтении набора результатов, тогда вся теория инициализации уже не имеет смысла.

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