Много запросов SHOW TRANSACTION ISOLATION LEVEL в postgres

Я использую Hibernate 4, PostgreSQL и C3P0.

В моем веб-приложении через некоторое время я получаю несколько запросов SHOW TRANSACTION ISOLATION LEVEL в базе данных, из-за которых мой сервер зависает. В моем коде все мои соединения правильно закрыты.

Это из-за утечки соединения?


person Ricky    schedule 02.02.2016    source источник
comment
Возможно, это делает ваш уровень обфускации (он же ORM) или c3p0 — проверьте их конфигурации (например, может быть, он настроен как запрос проверки в c3p0). Это не то, что Postgres делает сам по себе. И откуда вы знаете, что этот конкретный запрос является причиной зависания вашей базы данных (также какой именно сервер зависает? База данных? Сервер приложений?)   -  person a_horse_with_no_name    schedule 02.02.2016
comment
Мой сервер приложений зависает, и 98% запросов относятся к УРОВНЮ ИЗОЛЯЦИИ SHOW TRANSACTION, а остальные относятся к выбору запроса проверки 1. Моя куча памяти заполняется.   -  person Ricky    schedule 02.02.2016
comment
Ну тогда видимо проблема с конфигурацией вашего сервера приложений. И как узнать, что эти запросы зависли? Если вы проверяете pg_stat_activity, вам нужно проверить столбец state, чтобы узнать, выполняется ли запрос в данный момент или это был только последний запрос, выполненный сеансом. Вы предоставили гораздо меньше информации, чтобы кто-то мог ответить на этот вопрос.   -  person a_horse_with_no_name    schedule 02.02.2016
comment
Я наблюдаю аналогичную проблему. Мое приложение случайным образом генерирует исключение org.springframework.transaction.CannotCreateTransactionException, когда оно пытается создать транзакцию с явным уровнем изоляции. Ошибка вызвана тем, что соединение уже имеет активную транзакцию с другим уровнем изоляции (чего быть не должно). Иногда я вижу соединения, застрявшие в состоянии «ожидание в транзакции», а последний запрос запуска был «ПОКАЖИТЕ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ».   -  person notclive    schedule 30.12.2016


Ответы (5)


Вы также должны проверить state каждого запроса, если это idle, скорее всего, ничего сложного.

pg_stat_activity покажет последний запрос, выполненный каждым открытым соединением. А c3p0 использует SHOW TRANSACTION ISOLATION LEVEL, чтобы оставить соединение открытым (нормальное и ожидаемое поведение).

Вот что происходит:

  1. Соединение открыто
  2. SHOW TRANSACTION ISOLATION LEVEL выполняется, чтобы соединение оставалось открытым.
  3. Пул соединений будет периодически отправлять этот запрос (например, каждые 10 минут), чтобы соединение оставалось открытым.
  4. Эти запросы отображаются в pg_stat_activity, потому что в некоторых случаях это были последние запросы, выполненные через данное соединение. Также они будут отображаться как idle, потому что это соединение не используется активно.
person wlk    schedule 27.01.2017

Похоже, вы слишком быстро прокручиваете соединения в пуле соединений.

Это может быть связано с тем, что вы установили слишком агрессивный maxIdleTime или maxConnectionAge, или из-за того, что Connections не проходят тесты Connection и удаляются, или потому что ваше приложение по ошибке реконструирует пул, когда оно запрашивает Connections, вместо того, чтобы удерживать и использовать стабильный пул. (Это очень плохая, но удивительно распространенная ошибка.)

c3p0 проверяет уровни изоляции соединения один раз для каждого полученного соединения. Поскольку приобретенные подключения должны иметь длительный срок жизни в пуле, амортизируемые накладные расходы незначительны.

Но если из-за какой-то проблемы с конфигурацией или ошибки ваше приложение имеет c3p0, постоянно получающее подключения, по одному на клиента или, что еще хуже, если вы восстанавливаете пул для каждого клиента, то проверки изоляции транзакций могут стать видимым признаком более серьезной основной проблемы. .

person Steve Waldman    schedule 03.02.2016

несколько запросов SHOW TRANSACTION ISOLATION LEVEL в базе данных, из-за которых мой сервер зависает.

Это очень сложно (я бы сказал невозможно), что ваш сервер зависает из-за нескольких запросов этого. Если ваш сервер зависает, вам следует проверить свою конфигурацию и убедиться, что вы используете последний второстепенный патч, доступный для вашей версии.

SHOW TRANSACTION ISOLATION LEVEL выполняется каждый раз, когда приложение вызывает Connection.getTransactionIsolation(), C3P0 вызывает getTransactionIsolation() каждый раз, когда создает соединение.

Если пул соединений создает и уничтожает большое количество соединений, вы получаете много запросов SHOW TRANSACTION ISOLATION LEVEL к базе данных, потому что драйвер PgJDBC выполняет запрос каждый раз, когда он вызывает getTransactionIsolation().

person JorSol    schedule 13.10.2017

измените тестовое соединение при регистрации и проверке как false в c3p0

person part    schedule 08.04.2018

Я видел ту же проблему. Похоже, это произошло при использовании более высокой версии postgress. Я исправил это, обновив драйвер postgress 42.2.6.

person Herbert    schedule 28.11.2019