Мы запускаем веб-приложение Java EE в JBoss, которое использует PostgreSQL 8.0.9 в качестве базы данных.
Одна страница в приложении выполняет большой и сложный запрос при загрузке.У нас была проблема, которая проявлялась, если пользователь запрашивал эту страницу и закрывал окно браузера до того, как запрашиваемая страница была возвращена клиенту.Проблема заключалась в том, что закрытие окна породило бы новый поток / процесс PostgreSQL (доступный для просмотра сверху), а новому потоку / процессу потребовалось бы много времени, чтобы переключиться из SELECT в режим ожидания в верхнем выводе.Если примерно 5 или более пользователей сделали это (закрыли окно браузера до того, как большая сложная страница запроса вернулась к клиенту), то в маленьком окне времени порожденные потоки / процессы росли и не переключались в режим ожидания (оставаясь в SELECT) и потреблялимного процессора, вызывая серьезные проблемы с производительностью.Важно отметить, что, если пользователи, закрывшие окно браузера, вышли из системы, связанный поток / процесс переключился бы в режим ожидания и использование ЦП уменьшилось бы.Также важно упомянуть, что если JBoss был перезапущен, применимые потоки / процессы переключились бы в режим ожидания (так как все пользователи вышли бы из системы при перезапуске).
Кажется, что проблема зависания потоков / процессовбыли решены путем резервного копирования базы данных и восстановления.Теперь новые потоки / процессы, которые порождаются, переключаются из режима SELECT в режим ожидания за обычно короткий промежуток времени, и ЦП не отягощен ими.Кроме того, производительность по большим сложным запросам в целом, по-видимому, значительно улучшилась с момента восстановления.
Мы запускаем VACUUM каждые 24 часа в базе данных.Мы не запускаем REINDEX для базы данных из-за риска повреждения данных.Мы склонны иметь довольно высокие числа ожидания на выходных данных iostat, особенно в описанных выше случаях проблем с производительностью.
Что происходит с базой данных, когда она выгружается и восстанавливается (например, REINDEX и т. Д.)?Какой из них, по-видимому, является ключом к нашему решению?
Существует ли параметр, который управляет количеством потоков / процессов, которые создаются при закрытии окон браузера до того, как страница с большим сложным запросом возвращается вклиент?Есть ли настройка для управления переходом потоков / процессов, подобных этому, из SELECT в режим ожидания?Есть ли возможность управлять любым из них на уровне приложения?