Подтвердить что ты не робот

Технические причины не устанавливать grails.gorm.autoFlush и grails.gorm.failOnError для true в Config.groovy?

Помимо очевидных последствий для этого, хорошие технические причины не для установки grails.gorm.autoFlush = true и grails.gorm.failOnError = true в Config.groovy?

4b9b3361

Ответ 1

GORM - обертка вокруг Hibernate (по крайней мере, одна из реализаций - теперь есть также различные реализации NoSQL, такие как Redis). Установив autoFlush в true, вы запрещаете Hibernate возможность оптимизировать вызовы, которые он вызывает в базе данных. Например, вы можете заставить его вставлять, а затем обновлять, когда одной вставки может быть достаточно. В этом нет ничего плохого в этом, это просто не нужно и менее эффективно. Hibernate достаточно умен, чтобы знать, когда нужно писать в базу данных и может оптимизировать - вы отвлекли эту проблему.

Настройка failOnError приведет к тому, что save будет генерировать исключение всякий раз, когда вы пытаетесь сохранить объект домена, который не проверяется. При создании приложения, которое включает в себя создание объектов из пользовательского ввода, довольно нормально для объектов, которые не проверяются - недостающие входы, неправильные форматы и т.д. Обработка исключений должна сохраняться для исключений и ошибок - она ​​не должна использоваться для нормального потока приложения, save() возвращает объект, когда объект был успешно сохранен, или null в противном случае, что дает вам более удобный способ обработки проверки как части потока приложения, а не поместить блоки try-catch по всему месту.

Питер Ледбрук (автор "Grails in Action" ) написал большую серию статей "GORM Gotchas", в которых он более подробно обсуждает некоторые из этих вопросов - стоит прочитать: часть 1, часть 2 и часть 3.

Ответ 2

Я использую оба и считаю, что у меня есть большие причины, по которым я хочу поделиться с вами.

Зачем использовать grails.gorm.autoFlush = true?

Не действительно сохраняет объект/домен, когда я вызываю save(), не выполняет то, что я говорю API. Это вызывает много головных болей, когда Hibernate флеширует на 16 строк раньше исполнения, и это приносит боль для отладки. Это ваша команда не разработчик Java, это большая боль.

Грайльс заимствовал шаблон активной записи из Ruby (методы персистентности вызываются напрямую, например domain.save), но Ruby действительно делает упор, когда вызывается функция save(), но Grails не потому, что они скрывают "Hibernate Session", от пользователя/разработчика API. Это серьезный отказ от абзаца с ошибкой GORM, который мы можем решить с помощью этого параметра конфигурации.

После установки, если вам действительно нужен шаблон рабочей единицы Hibernate, который вызывает вызовы SQL и делает это только один раз по соображениям производительности, просто используйте domain.save(flush:false) при необходимости.

Зачем использовать grails.gorm.failOnError = true?

Никогда не скрывайте исключение от пользователя. Все великие программисты Java знают это. Если вам действительно нужно скрыться, запишите его как предупреждение. Но этого, к сожалению, не бывает, когда проверка Grails терпит неудачу (нет журнала!) И делает программистов слепыми, что-то действительно трудное для новичков, которые этого не знают. Самые опытные ребята просто говорят "легко настроить", но это просто порочный, чем лучший способ.

Ради этого, GORM Leaky Abstraction был единственным, кто жалуется на то, что я был с Граалем в прошлом. В настоящее время они только что ушли с этими параметрами конфигурации.

Ответ 3

Хорошая серия статей Питера Ледбрука о GORM:

Хотя я не согласен с ним в том, что делает сеанс сеанса Hibernate. Он говорит, что "Flush: true заставляет Hibernate постоянно сохранять все изменения в базе данных". Ну, это произойдет только в неконкурентном контексте, потому что, когда вы находитесь в транзакции, операторы #SQL, которые очищаются от сеанса Hibernate, будут выполняться в сегменте отката вашей транзакционной СУБД. Таким образом, они не будут полностью сохранены, пока сделка не будет совершена.

Когда в транзакции вы выполняете другие операции, не связанные с БД, например, отправляя электронное письмо с подтверждением, вы хотите знать, произошло ли какое-либо ограничение времени выполнения или ошибка выполнения БД, явно не заявленная в вашей проверке, прежде, чем, например, вы отправил это письмо с подтверждением.

Мой совет заключается в том, что стратегия autoFlush (grails.gorm.autoFlush = true) не является само по себе неправильной. Вы должны принять техническое решение abouth, хотите ли вы использовать его или нет в начале, чтобы разработчики могли написать свой код соответственно, поскольку они будут знать, нужно ли выполнять флеш, или Hibernate сделает это для них в конце вы метод транзакции.

Еще один распространенный случай использования - если вы хотите выполнить пакетную операцию с использованием GORM. Если вы не очищаете сеанс Hibernate при любом количестве операций SQL, у вас возникнут проблемы.