Есть ли таймаут блокировки жидкости?
Вы можете увидеть в выпуске здесь: ( причины-причины- разницы), когда клиент Liquibase блокируется, когда операция Liquibase была прервана, оставляя ликвидазу в заблокированном состоянии.
Мне интересно, есть ли способ настроить Liquibase для автоматического обнаружения этой ситуации по дате и времени в LOCKGRANTED
колонка. Я думаю, что если вы держали замок в течение часа - вы должны назвать это просроченным замком.
Мой вопрос: есть ли тайм-аут блокировки жидкости?
3 ответа
Нет тайм-аута блокировки. Liquibase не имеет представления о том, как долго ждать changeSets, и если некоторые работают с DML на больших таблицах, им может потребоваться несколько часов для успешной работы.
Существует команда releaseLocks, которую вы можете использовать для снятия блокировок вручную, или вы можете создать подкласс liquibase.lockservice.StandardLockService, чтобы добавить дополнительную логику для переопределения блокировки после определенного периода времени.
Если у вас есть только один компьютер, который будет обновлять базу данных, вы можете рассмотреть также https://github.com/liquibase/liquibase-nochangeloglock, что полностью отключает поддержку блокировки.
Мне показалось, что это полезная функция, которую можно настроить, поэтому я добавил https://liquibase.jira.com/browse/CORE-2375 чтобы отслеживать эту функцию.
На самом деле, глядя на код StandardLockService, его можно настроить с помощью системного свойства "liquibase.changeLogLockWaitTimeInMinutes"...
public class StandardLockService implements LockService {
...
private long changeLogLockWaitTime = 300000L;
....
public StandardLockService() {
try {
this.changeLogLockWaitTime = 60000L * Long.parseLong(System.getProperty("liquibase.changeLogLockWaitTimeInMinutes"));
LogFactory.getLogger().info("lockWaitTime change to: " + this.changeLogLockWaitTime);
} catch (NumberFormatException var2) {
;
}
}
Существуют расширения, которые могут либо добавить тайм-аут, либо снять блокировку. К сожалению, все они могут быть опасны, потому что они не проверяют, жив (и работает ли) исходный процесс, получивший блокировку.
Официальная поддержка снятия блокировки с Postgres до сих пор не объединена: https://github.com/liquibase/liquibase/pull/1417
Есть несколько расширений, которые также могут помочь:
- https://github.com/oridool/liquibase-locking — разблокируется, если предыдущая сессия не активна (Postgres)
- https://github.com/szintezisnet/Kubernetes-Liquibase-Lock-Release — разблокировка на основе метаданных K8s
Если этого недостаточно, вы всегда можете создать расширение Liquibase в соответствии с вашими потребностями. Я сделал это для поддержки развертывания одного экземпляра с помощью https://github.com/hsiliev/liquibase-lock-timeout.