Кирилл Данилов (donz_ru) wrote,
Кирилл Данилов
donz_ru

Category:

Окончательное решение wait_timeout у MySQL

В общем, то, что я слабал, полная фигня, и решает проблему в частных случаях.
На самом деле все проще.

В настройках датасорса надо указать:

minEvictableIdleTimeMillis="1800000"
timeBetweenEvictionRunsMillis="600000"
numTestsPerEvictionRun="5"
testWhileIdle="true"
testOnBorrow="false"
validationQuery="select 1"

minEvictableIdleTimeMillis - минимальное время жизни коннекта в состоянии idle в мс. Если с его прошедшего использования (active) прошло более времени, чем указано в опции, то коннект будет закрыт и объект соединения уничтожен при ближайшем проходе сборщика неиспользуемых объектов (idle) пула, если сборщик доберется до этого объекта. А может и не добраться, если значение параметра, отвечающего за количество тестируемых неиспользуемых объектов меньше (см. ниже), чем объектов может находиться в idle.
То есть, в принципе, соединение может находиться в состоянии idle более указанного времени, потом его кто-то запросит (переведет в состояние active), и он будет далее жить, не смотря на сборщик ниспользуемых объектов пула. Или даже никто запрашивать не будет, но сборщик объектов просто до него не дойдет
timeBetweenEvictionRunsMillis - период запуска сборщика неиспользуемых объектов пула. Соответственно, idle объекты при указании этого параметра и minEvictableIdleTimeMillis могут прожить максимум timeBetweenEvictionRunsMillis + minEvictableIdleTimeMillis времени в состоянии idle, если сборщик объектов проходит по максимально возможному количеству объектов в idle. То есть, если количество проходов сборщика мусора за один его вызов не менее maxIdle.
numTestsPerEvictionRun - сколько объектов из idle сборщик мусора должен проверить за один вызов. Чтобы не пропустить ни одного объекта, это значение должно быть не менее maxIdle. Можно больше, но тогда ( numTestsPerEvictionRun - maxIdle ) раз тестов будут ходить впустую, повторно проверяя объекты (если не принимать во внимание время, прошедшее с вызова сборщика, а оно мало)
testWhileIdle - нужно ли тестировать соединения на валидность, когда они находятся в состоянии idle. На валидность тестирует сборщик объектов. Валидность проверяется запросом validationQuery к БД. При значении true должно быть указано значение validationQuery
testOnBorrow - нужно ли тестировать соединение на валидность, при их запросе из пула. По умолчанию true, то есть при каждой выдаче соединения из пула идет запрос validationQuery к базе, что может быть расточительным. При значении true должно быть указано значение validationQuery
validationQuery - запрос, которым соединения будут тестироваться. Если он не указан, то ни один из тестов не будет выполняться

При указанных настройках время жизни неиспользуемого соединения составляет 30 минут. Сборщик неиспользуемых объектов вызывается каждые 10 минут. При каждом вызове сборщика объектов все 5 максимально возможных неиспольуемых соединений (maxIdle также должно быть равно 5, соответственно) тестируются на валидность. Если соединение не валидно, оно закрывается и уничтожается из пула. При выдаче соединения пользователю оно не тестируется на валидность. Валидность проверяется запросом "select 1".
Это позволяет избежать исключений из-за мускульного закрывания коннекта, который не был активен более восьми часов. Также проводится проверка валидности коннектов каждые десять минут. То есть, при рестарте базы исключения, связанные с недоступностью базы, могут генерироваться максимум в течении десяти минут с момента рестарта базы (обрыва коннекта со стороны базы). Плюс при отсутствии активности какого-либо соединения более 30 минут, оно в течении следующих 10 минут будет закрыто, что позволит освободить ресурсы базы, а не держать ненужное открытое соединение.

Я нигде не напутал?
 



Tags: java, mysql, базы данных, полезное
Subscribe

  • Новость-молния из Дахаба!

    У съема квартиры в Дахабе есть и минусы - сижу и жду, когда починят участок говнопровода между моим и нижним этажом. Зато наконец появилось время на…

  • Пересмотр приоритетов в логистике

    В рамках начала подведения итогов года. У меня с ковидом нормально так изменилось отношение к удобству в транспорте. Раньше на…

  • Мотивация выучить иностранный язык

    Тут на одном форуме сделали анализ лексикона пользователей. Мой словарный запас по итогам последних 420 комментариев около пяти тысяч слов. Так как…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments