Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Tomcat "держит" файл базы данных


Автор: elvis79 6.8.2011, 13:15
Привет всем! Изучаю java на примере http://forum.vingrad.ru/forum/topic-124877.html. Все ок, паралельно дошел до 4-й жирной черты. Но заметил одну неприятную, особенность. Что-то "держит" файл баззы данных. Возможно я не понимаю механизм работы сервлетов в java :(

1. Настройки соединения persistence.xml считываются только при первом обращении на http://localhost. Если их изменить, обновить страницу, или закрыть и открыть браузер - ничего не меняется. Помогает только перезапуск tomcat

2. Если зайти на страницу, которая вытягивает некоторые данные из БД, а потом перезапустить сервер БД, то при обновлении возникает ошибка 

3. Ну и физически изменить (удалить) файл БД нельзя, если хотя-бы раз выполнялся сервлет. Отпускает все тот-же перезапуск tomcat

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

Подскажите, в чем проблема, может я что-то не так делаю, ну и можно линки на литературу для понимания механизмов.

П.С.: Попробую сделать маленький тестовый примерчик, чтоб показать

Добавлено через 10 минут и 9 секунд
Упс, наверное дело в самой логике программы - синглтона Infinity - он не убивается в конце, висит где-то, и при повторном запуске держит свои собственные настройки старыми.

Автор: Nofate 6.8.2011, 13:38
Представьте, что экземпляр класса, организующего связь с БД, создается при старте приложения и существует до завершения работы. Тогда становится понятно, что:
1. Достаточно перезапускать само приложние, а не весь томкат.
2. Ошибка возникает из-за того, что соединение с БД потеряно и никто не просил его возобновлять.
3. Разумеется, так как с базой данных установлено соединение все время, а не только в момент вызова сервлета.


Автор: elvis79 6.8.2011, 13:56
Да так и есть. Проверял, и даже более того - файл настроек в котором такие значения как, например название сайта, версия и т.д., тоже не перечитывается. Тогда вопрос когда приложение убивается?

По вашим ответам:
Цитата(Nofate @  6.8.2011,  13:38 Найти цитируемый пост)
1. Достаточно перезапускать само приложние, а не весь томкат.

Не помогает, и что вы имеете в виду "перезапускать приложение" - обновить страницу, переоткрыть браузер? Тесты в самой java работают отлично, а вот как живет сервлет я не понимаю. Когда он умирает и когда рождается

Цитата(Nofate @  6.8.2011,  13:38 Найти цитируемый пост)
2. Ошибка возникает из-за того, что соединение с БД потеряно и никто не просил его возобновлять.

Тут тоже должно помочь "перезапустить приложение"

Цитата(Nofate @  6.8.2011,  13:38 Найти цитируемый пост)
3. Разумеется, так как с базой данных установлено соединение все время, а не только в момент вызова сервлета.

Как остановить, убить сервлет - только перезапуск томкат? Или менять логику программы, чтоб соединение устанавливалось при каждом обращении (на каждой странице по-новому) -- не лучшее решение, так как будет очень медленно работать

Автор: Nofate 6.8.2011, 14:19
"Перезапускать приложение" значит именно перезапустить приложение на сервере. В отличие от например PHP жизненный цикл web-приложения не ограничен обработкой запроса к сервлету.

Вам стоит почитать как работает Tomcat. В общем и целом упрощенно процесс примерно такой:
1. Вы разворачиваете (deploy) приложение на сервере Tomcat.
2. Tomcat стартует (start) приложение и инициализирует согласно описания web.xml. Загружаются прочие конфигурационные файлы, устанавливается соединение с БД (!).
3. Tomcat обрабатывает запросы от клиентов к вашему приложению и перенаправляет на ваши сервлеты. 
4. Т.к. приложение к этому моменту запущено и работает ваши java-объекты могут сохранять состояние между запросами.
5. Вы можете остановить (stop), перезапустить (restart) или свернуть (undeploy) приложение на сервере приложений. Так или иначе при завершении работы приложения освобождаются ресурсы, закрываются соединения с БД и открытые файлы.

Подробности можно найти в руководстве по Tomcat и в спецификации Servlet API

Автор: elvis79 6.8.2011, 14:24
Спасибо, рано или поздно я б к этому дошел, но ели написать, то понимаешь быстрее)) Пошел гуглить про Томкат! Однако трудно после php

Автор: Nofate 6.8.2011, 14:27
После PHP главное осознать, что вы имеете дело не с набором отдельных страничек, а с цельным программным продуктом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)