Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Закрытие соединения к БД
Всем привет!
У меня при создании 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...
добавил анотацию @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)