Какой смысл указывать hibernate.jdbc.batch_size?
Эта конфигурация Hibernate якобы должна контролировать, сколько объектов кэшируется в кэше первого уровня. Причина достаточно проста для понимания, мы не хотим исчерпать память.
Но что-то меня смущает. Каждая реализация, которую я видел, включая этот сайт, имеет явный флеш и чистоту. Нет проблем, но в чем смысл свойства конфигурации?
Примечание: я предполагаю, что Hibernate каким-то образом отслеживает размер кеша, и если число объектов определенного типа становится больше размера кеша, то синхронизируйте кеш с базой данных. Не знаю, если это предположение неверно???
1 ответ
Этот параметр конфигурации не имеет никакого отношения к размеру кэша первого уровня. И очистка сессии ничего не удаляет из кэша. Он записывает ожидающие изменения (вставки, удаления, обновления) в базу данных. Кэш очищается только при явном вызове clear() или при закрытии сеанса. Если вы не очистите или не определите сессию (или удалите конкретные объекты), кэш будет расти и расти. Что не является проблемой, так как обычно это очень недолговечно (продолжительность транзакции).
Пакетные обновления JDBC позволяют отправлять несколько запросов на обновление в одном пакете в базу данных. Это уменьшает количество сетевых вызовов. Вы можете просмотреть его как загрузку несжатого почтового индекса, содержащего 20 файлов, вместо отправки 20 файлов по отдельности.
Путаница возникает из-за того, что упомянутые на странице, указанной в вашем вопросе, пакетные обновления не имеют ничего общего с пакетными обновлениями JDBC. Что означает Hibernate под пакетными обновлениями, так это "обновления, выполняемые пакетным заданием". Пакетное задание обычно имеет гораздо более длинные транзакции, чем типичные бизнес-сценарии, и обновляет сотни, тысячи или даже больше объектов в одной транзакции. Вот почему Hibernate рекомендует регулярно очищать и очищать сеанс в этом случае, чтобы избежать нехватки памяти.