powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
36 сообщений из 36, показаны все 2 страниц
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278510
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Есть Tomcat 9.
Есть примерно N REST сервисов, каждое из которых - отдельное веб-приложение.
Все эти N сервисов задеплоены на один томкат.

Есть один инстанс Postgres.

Сейчас каждое из REST-приложений использует свой экземпляр ConnectionPool.
Предположим, каждый пул резервирует M -соединений.

Поэтому, может оказаться такая картина, что даже без нагрузки на web-приложения,
в памяти будет удерживаться N * M idle-соединений.

Либо другая ситуация:
веб-приложение A будет более высоконагруженное, чем приложение B.
В этом случае - ресурсы (connections) приложения B будут простаивать.

Мне кажется, лучше использовать общий пул, на весь tomcat. И каждое из приложений будет его использовать (например через JNDI).

Не будет ли в данном решении узких мест?
Тоесть, еще раз резюмируя главный вопрос:

Что лучше - отдельный ConnectionPool для каждого веб-приложения, либо общий пул на все?
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278515
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirage,
Что мешает сделать пул на каждое приложение + minIdleConnections = 0?
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278519
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что делать нехардкод уже религия запрещает...
Сделаете нехардкод,---чтоб можно было переключатся и так и так.
Ведь речь идёт о строке JNDI...
А на практике увидите ,что лучше.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278545
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас у каждого модуля свой пул внутри реализован? В любом случае есть смысл вынести конфигурацию в Tomcat.
Общий пул проще мониторить и конфигурировать. Но если нужен какому-то модулю особой конфиг, ничего не мешает прописать 2 пула или больше.
Так же, на сколько я понимаю, Tomcat позволяет и любую реализацию пула подсунуть.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278549
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУ вас у каждого модуля свой пул внутри реализован?

У каждого модуля одинаковая конфигурация пула. Используется одинаковая БД.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278555
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageУ каждого модуля одинаковая конфигурация пула. Используется одинаковая БД.
В Context.xml?
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278557
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageBlazkowiczУ вас у каждого модуля свой пул внутри реализован?

У каждого модуля одинаковая конфигурация пула. Используется одинаковая БД.

Просто каждый модуль держит открытым свой инстанс пула.
Конфиг пула для каждого модуля примерно такой:

Код: java
1.
2.
3.
InitialSize = 10
MaxActive = 30
MaxIdle = 10
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278558
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю насчет PostgreSQL, но в Oracle Thin JDBC по умолчанию кешируются запарсенные Prepared Statement'ы... т.ч. пихать все в один пул - не очень хорошая идея. Повторное использование будет сведено к 0. Правда не очень понятно, насколько оно вообще оправдано, кроме того, что жрет оперативную память

В общем "не все так однозначно" ( C )

IMHO & AFAIK
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278563
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczunicornmirageУ каждого модуля одинаковая конфигурация пула. Используется одинаковая БД.
В Context.xml?

Нет, модули не используют конфиг из context.xml, а создают пул программно.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278623
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageМне кажется, лучше использовать общий пул, на весь tomcat. И каждое из приложений будет его использовать (например через JNDI).
да вроде нет никаких противопоказаний.
JNDI он и в африке JNDI
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278626
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unicornmirageМне кажется, лучше использовать общий пул, на весь tomcat. И каждое из приложений будет его использовать (например через JNDI).
да вроде нет никаких противопоказаний.
JNDI он и в африке JNDI

Есть один аргумент против такого подхода - microservice architecture.
Если будет общий пул на все REST-сервисы, то при его переполнении - все выйдут из строя.
Если будет каждый пул на каждый REST-сервис - то выйдет из строя только одно (самое высоконагруженное)
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278632
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageЕсть один аргумент против такого подхода - microservice architecture.
====== это страшилка из 2-х слов которую никто не видел
Если будет общий пул на все REST-сервисы, то при его переполнении - все выйдут из строя.
==== не смешите. Вам 10т. соединений хватит? Нет? Тогда давайте цифры.
Если будет каждый пул на каждый REST-сервис - то выйдет из строя только одно (самое высоконагруженное)
==== см.выше.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278679
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892unicornmirage,
Что мешает сделать пул на каждое приложение + minIdleConnections = 0?

по-умолчанию этот параметр итак равен 0, согласно исходникам GenericObjectPool:

public static final int DEFAULT_MIN_IDLE = 0;
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278687
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если будет общий пул на все REST-сервисы, то при его переполнении - все выйдут из строя.
Если будет каждый пул на каждый REST-сервис - то выйдет из строя только одно (самое высоконагруженное)

+1

Выше я уже говорил, когда много пулов может быть полезно. Например Oracle Thin JDBC и его методика кеширования statement'ов (менялась от версии к версии). По факту, в результате подхода "один пул на все приложения", кэшь просто набирает дофига мусора и съедает дофига ОП.

На Oracle Customer Care & Billing пришлось долго корячится с настройками и перебрать кучу версий Oracle Thin JDBC, что бы хоть как-то зажило и перестало вылезать Out Of Memory.... (((
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278691
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лично я делаю обычно так:

в томкэт объявляем один пул
Код: xml
1.
2.
3.
 <Resource name="jdbc/postgres" auth="Container" type="javax.sql.DataSource" 
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              driverClassName="org.postgresql.Driver" />    



для каждого приложения конфигурируем ссылку на него (я это делаю в Catalina/host_name/context_name.xml)

Код: xml
1.
2.
 <ResourceLink name="jdbc/myapp"  global="jdbc/postgres"
                      type="javax.sql.DataSource" />



как только общего пула начинает по какой-то причине не хватать или не устраивает, создаем новый ресурс и меняем ссылку на него. все
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278693
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageЕсть один аргумент против такого подхода - microservice architecture.
Если будет общий пул на все REST-сервисы, то при его переполнении - все выйдут из строя.
Если будет каждый пул на каждый REST-сервис - то выйдет из строя только одно (самое высоконагруженное)
У вас все модули в одной JVM крутятся. Что нивелирует все вышеперечисленные аргументы.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278695
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczunicornmirageЕсть один аргумент против такого подхода - microservice architecture.
Если будет общий пул на все REST-сервисы, то при его переполнении - все выйдут из строя.
Если будет каждый пул на каждый REST-сервис - то выйдет из строя только одно (самое высоконагруженное)
У вас все модули в одной JVM крутятся. Что нивелирует все вышеперечисленные аргументы.

Потому что узким местом здесь будет JVM, tomcat?

можно поподробнее, почему нивелирует?
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278701
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageможно поподробнее, почему нивелирует?
Переполнение памяти одним модулем - все умрут.
Повышенная нагрузка на один модуль - все тормозят.
Поэтому достижение потолка соединений в пуле, это лишь одна из не многих потенциальных проблем.
Микросервисы же это отдельные процессы. Они на много более независимы чем JEE модули.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278767
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczunicornmirageможно поподробнее, почему нивелирует?
Переполнение памяти одним модулем - все умрут.
Повышенная нагрузка на один модуль - все тормозят.
Поэтому достижение потолка соединений в пуле, это лишь одна из не многих потенциальных проблем.
Микросервисы же это отдельные процессы. Они на много более независимы чем JEE модули.

Ок, предположим проблем с переполнением самой памяти нет.
А существует только проблема переполнения connection pool (ведь мы указываем для него лимит соединеий).
В данном случае - пул будет узким местом.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278817
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirage,
..."Жениться или не жениться - вот в чём вопрос.
А если жениться, то куда девать нынешнюю жену?"
))
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278830
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unicornmirage,
..."Жениться или не жениться - вот в чём вопрос.
А если жениться, то куда девать нынешнюю жену?"
))

другими словами - в данном случае - надо использовать то, что удобнее. ))

По-поводу проблемы с idle-соединениями: я попробовал задать следующие параметры для пула:

setMaxActive = 30
setMaxIdle = 10
setInitialSize = 10
setTimeBetweenEvictionRunsMillis = 30000
setMinEvictableIdleTimeMillis = 60000

Такая конфирурация включает pool sweeper.

И получилась такая картина:
1. стартует сервис. При первом обращении выделяется 10 idle-connections в пуле.
2. если немного подождать (пару минут), то все idle-connections удаляются из пула.
3. если загрузить сервис кучей запросов, то пул вырастает согласно необходимому количеству, которое требуется для обработки.
4. если снова подождать пару минут - пул снова полностью очищается.

Кажется, это то, что нужно. И в данном случае не обязательно использовать общий пул на весь томкат.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278854
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageИ в данном случае не обязательно использовать общий пул на весь томкат.
из за того что один пул или на каждое приложение, разница будет не такая очевидная.
Не такая очевидная чтобы ломать и переписывать.
У вас всё работает. Плюсы минусы расссмотрели).
Удачи!
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39278970
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageВ данном случае - пул будет узким местом.Ох уж это решение проблем, которые ещё даже не обозначились ...
Вам какая разница будет к базе тысяча подключение из одного пула или тысяча подключений из десяти пулов???
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279015
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovunicornmirageВ данном случае - пул будет узким местом.Ох уж это решение проблем, которые ещё даже не обозначились ...
Вам какая разница будет к базе тысяча подключение из одного пула или тысяча подключений из десяти пулов???

Разница обозначена в начальном топике:
если будет тысяча подключений из десяти пулов, и одна часть пулов будет менее загружена, чем другая - то часть idle-connections (из менее нагруженных пулов) не будет использоваться. Тоесть будут просто вхолостую висеть в памяти.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279025
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirage,
Почему вы все не конкретно?
Сколько байт в памяти занимает простаивающий коннект?
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279027
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может приложение выгружать если оно простаивает?
Коннект 2байта, а приложение в миллион раз больше.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279033
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unicornmirage,
Почему вы все не конкретно?
Сколько байт в памяти занимает простаивающий коннект?

Вот статистика только одного пула (с помощью программы pg_top):

PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
10020 postgres 20 0 208M 9648K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57165) idle
10019 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57164) idle
10017 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57162) idle
10015 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57160) idle
10018 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57163) idle
10016 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57161) idle
10014 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57159) idle
10012 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57157) idle
10013 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57158) idle
10011 postgres 20 0 208M 7472K sleep 0:00 0.00% 0.00% postgres: postgres db1 127.0.0.1(57156) idle

Если на томкате поднять все 10 приложений, то pg_top будет показывать 100 idle-connections.
Я эту проблему решил, включив опции пула для pool sweeper. Который после некоторого времени бездействия, удаляет все idle-connections.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279562
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageЕсли на томкате поднять все 10 приложений, то pg_top будет показывать 100 idle-connections.
Это, что проблема? Для чего нужны эти простаивающие? Чтобы быстро обслужить появившийся запрос не занимаясь оверхедом на открытие/закрытие соединения. Это основная функция пула.
А дальше по простой арифметике.

БД настроена на 1000 соединений. Есть 10 приложений.
а) делим по 100 на приложения и получаем, что то приложение, которое массово что-то делает в основном висит на ожиданиях освободившегося соединения, зато все остальные приложения работают в штатном режиме и используется всего ~110 соединений из 1000.
б) даем все один пул на 100 соединений. Если нагруженному приложению хватает 990 соединений то оно отрабатывает быстрее и остальные приложения работают в штатном режиме. Если же ему не хватает и надо гораздо больше, то все приложения начинают висеть на ожиданиях соединения.

Ну и всякие плюсы-минусы в качестве премиальных (переоткрытие свободных соединений если замечена смерть сервера и переезд на новый узел и т.п.).
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279565
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
б) даем все один пул на 1000 соединений.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279615
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевДля чего нужны эти простаивающие?
ему они не нравились после определённого времени. Например, тем что висят через час полсе бездействия
авторКоторый после некоторого времени бездействия
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279620
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы придерживался следующей схемы - общий пул, но помимо общего ограничения на максимальное количество соединений в пуле я бы ограничил возможность каждого приложения.
Например, 3 приложения, каждому нужно примерно 10, всего 30 соединений, но каждое отдельно взятое может использовать не более 15 (реальные цифры конечно же корректируются под реальный профиль нагрузки).
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279869
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageесли будет тысяча подключений из десяти пулов, и одна часть пулов будет менее загружена, чем другая - то часть idle-connections (из менее нагруженных пулов) не будет использоваться. Тоесть будут просто вхолостую висеть в памяти.И что???
Вы уже измерили это "вхолостую висеть в памяти" и именно эти байты/килобайты/мегабайты критичны для вашего приложения?

P.S. Начало нулевых - давно в прошлом и сотни-тысяча подключений уже перестала быть сверхнагрузкой.
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279976
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну возьмите готовое решение :

docker + tomcat + war

все ... на каждый микросервис свой томкат в своем контейнере ... кластерезуйте и масштабируйте как душе угодно ...
вот рабочий пример https://hub.docker.com/_/jetty/
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39279980
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ чтобы нагрузка не была такой большой
использовать кеши
https://blogs.oracle.com/theaquarium/entry/jcache_is_final_i_repeat

и очереди ... при использовании очереди - вам и двух потоков/коннектов к БД на каждое приложение хватить должно ...
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39280105
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1и очереди ... при использовании очереди - вам и двух потоков/коннектов к БД на каждое приложение хватить должно ...
точно, и страничку специальную показывать с надписью "в очередь, сукины дети"
...
Рейтинг: 0 / 0
Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
    #39283004
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirage,

у вас вполне случай для использования pgbouncer
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Общий пул на весь servlet container, или отдельный пул на каждое web-приложение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]