Всем привет!
У меня при создании UI происходит создание пула соединения к БД, к оторому присоединяется TableQuery. При запуске приложения и при любом обновлении окна браузера, соединения к базе множатся. Если обновить окно много раз выскакиевает сообщение от БД, что превышено кол-во соединений.
Соответственно вопрос когда в Vaadin нужно закрывать соединения, сессии, пул.
Событие sessionDestroy как указано в мануале у меня никогда не срабатывает ни при закрытии браузера, ни при обновлении ,ни если подождать некоторое время. Соединения сбрасываются только перезагрузкой службы БД.
Приветствую!
Тут вопрос более широкий и не связан с vaadin А с пулом всё просто, взял соединение из пула, поработал с данными, закрыл соединение.
Тут несколько моментов :
- Как пул работает я знаю, но пул создается в момент создания UI и начинает плодиться при каждом запуске приложения или обновления страницы.
- Взять соединение из пула отдельно не полчится TableQuery к нему само подключается. Правильно ли я понимаю, что в этом случае, нужно постоянно TableQuery подключать / отключать?
Ааа, вы о TableQuery. К своему стыду или к счастью никогда им не пользовался. Прокоментировать не смогу. Сам отделяю мух от котлет. Работа с базой и бизнес логика у меня в отдельном слое, представление в другом.
Ну а зачем использовать все эти хибернейты, xml мэппинги, сервисы, сущности и т.д. Когда для приложения из простых справочников и документов функциональности TableQuery выше крыши…и две строчки кода. Справочная форма со всей функциональностью один маленький классик, запихнуть который можно куда угодно и на панельку и в подбор. Я и выбрал Vaadin только из-за этой функциональности, что все просто и непринужденно с данными.
Осталось решить задачу с соединениями, подсказывайте куда копать…
Приветствую!
Жизненный цикл пула соединений совпадает с циклом жизни приложения, а не UI объектов, которые создаются постоянно по мере обращения к приложению. Другими словами: приложение стартует - создаёте пул, останавливается - уничтожаете. Каждому экземпляру приложения требуется только один пул. Достичь этого можно множеством разных способов, в зависимости от архитектуры приложения. В самом простом варианте попробуйте использовать Singleton.
Удачи!
Сергей, это в 6 ой версии так, в 7 ой уже не так. Там базовый класс UI, а не Application. C приложением, конечно, более удобно и если подобрать из статистики максимальное кол-во соединений, котрые пул может насоздавать и база переварить, то проблема решится сама собой. В 7 ой версии это все сложнее и как быть пока не понятно.
Андрей,
я имел в виду ваше приложение в целом, не класс Application. Вам придётся отойти от конфигурации по умолчанию, где сервлет стандартный и не используется web.xml. Самый простой вариант - создать свой класс сервлета и использовать метод servletInitialized. Посмотрите главу https://vaadin.com/book/-/page/application.lifecycle.html.
Удачи!
Блин, ну не ужели простого решения то нет? Долен же быть какой массовый bestpractice…
up
добавил анотацию @VaadinServletConfiguration(ui = MyUI.class, productionMode = false,
closeIdleSessions = true
)
чтобы сессия закрывалась как только UI закрываетсяи в UI.Init добавляю событие
this.addDetachListener(e->{
pool.destroy();
});
Все по этой инструкции
https://vaadin.com/wiki/-/wiki/Main/Cleaning+up+resources+in+an+UI
Но это событие никогда не срабатывает. И пул не сбрасывает. Как поймать момент когда пользователь закрывает браузер и/или UI уничтожается?
Спринга нет в проекте? Если нет то то пул талкаем в синглтон. Класс у которого есть поле статическое и об него делается недопущение создания других экземпляров.
Пулом не пользуюсь…
только с heartbeatInterval у меня получалось понимать что юзер закрыл юай.
@VaadinServletConfiguration(productionMode = false, ui = MainUI.class, closeIdleSessions = true, heartbeatInterval = 100)