В этой статье подробно анализируется использование Hibernate для управления сеансовыми и пакетными операциями. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Hibernate управляет сеансом
Сам Hibernate предоставляет три метода управления объектами сеанса: 1. Жизненный цикл объекта сеанса привязан к локальному потоку. 2. Жизненный цикл объекта сеанса привязан к транзакции JTA. 3. Программа делегата Hibernate управляет жизненным циклом объекта сеанса.
В файле конфигурации Hibernate атрибут hibernate.current_session_context_class используется для указания метода управления сеансом. Дополнительные значения включают:
① поток: жизненный цикл объекта сеанса привязан к локальному потоку. ② jta*: жизненный цикл объекта сеанса привязан к транзакции JTA. ③ управляемый: программа делегата Hibernate для управления жизненным циклом объекта сеанса.
Жизненный цикл объекта Session привязан к локальному потоку:
Если для значения атрибута hibernate.current_session_context_class файла конфигурации Hibernate установлено значение thread, Hibernate будет управлять сеансом способом, привязанным к локальному потоку.
Hibernate привязывает сеанс к локальному потоку в соответствии со следующими правилами:
Когда поток (поток) вызывает метод getCurrentSession() объекта SessionFactory в первый раз, этот метод создаст новый объект Session (sessionA), привяжет объект к потоку A и вернет сеанс, когда поток A снова вызовет объект SessionFactory. При использовании метода getCurrentSession() этот метод вернет объект sessionA. Когда поток A отправляет транзакцию, связанную с объектом sessionA, Hibernate автоматически сбрасывается. Кэшируйте объект sessionA, затем зафиксируйте транзакцию и закройте сеанс по желанию. Когда потокA отменяет транзакцию, связанную с объектом sessionA, объект sessionA также будет автоматически закрыт. Если потокA снова вызывает метод getCurrentSession() объекта SessionFactory, этот метод создаст новый объект сеанса (sessionB) и свяжет объект с ним. потокA и вернуть сеансB.
Пакетная обработка данных
Пакетная обработка данных подразумевает обработку большого объема данных за одну транзакцию и пакетные операции в процессе прикладного уровня. Основные методы следующие:
① Через сеанс
② Пройти HQL
③ Через StatelessSession
④ Через JDBC API ---- Рекомендуется, поскольку это самый быстрый способ.
Сессия выполняет пакетные операции:
Методы сеанса save() и update() сохраняют обработанные объекты в собственном кеше. Если объект сеанса используется для обработки большого количества постоянных объектов, объекты, которые были обработаны и к которым больше не будет доступа, должны быть своевременно очищены из кэша. Конкретный метод заключается в немедленном вызове методаlush() для обновления кеша после обработки объекта или небольшой партии объектов, а затем вызове методаclear() для кэширования кеша.
На операции обработки через сеанс распространяются следующие ограничения:
Количество однопакетных обработок JDBC необходимо установить в файле конфигурации Hibernate. Необходимо убедиться, что количество пакетов операторов SQL, каждый раз отправляемых в базу данных, соответствует атрибуту размера пакета.
Если объект использует генератор идентификаторов «идентичности», Hibernate не может выполнять операции пакетной вставки в JDBC.
При выполнении пакетных операций рекомендуется отключить кеш второго уровня Hibernate.
Демонстрация кода для пакетной вставки данных:
Скопируйте код и код будет следующим: News news = null;
for(int я = 0; я <10000; я++) {
новости = новые новости();
news.setTitle("--" + i);
session.save(новости);
если((я + 1) % 20 == 0) {
сеанс.flush();
сеанс.очистить();
}
}
Пакетное обновление. При выполнении пакетного обновления явно нецелесообразно загружать все объекты в кэш сеанса одновременно, а затем обновлять их один за другим в кэше.
Используйте прокручиваемый набор результатов org.hibernate.ScrollableResults. Этот объект фактически не содержит никаких объектов, а только курсор, используемый для поиска записей в Интернете. Только когда программа обращается к определенному элементу объекта ScrollableResults, она загружает соответствующий объект в базу данных.
Объект org.hibernate.ScrollableResults возвращается методом прокрутки Query.
Пакетные операции через HQL:
Примечание. HQL поддерживает только операторы вставки в форме INSERT INTO...SELECT, но не поддерживает операторы вставки в форме INSERT INTO...VALUES. Поэтому операции пакетной вставки не могут быть выполнены с использованием HQL.
Пакетные операции через StatelessSession:
Формально использование StatelessSession аналогично Session. По сравнению с сеансом StatelessSession имеет следующие отличия:
StatelessSession не имеет кэша, а объекты, загружаемые, сохраняемые или обновляемые через StatelessSession, находятся в свободном состоянии.
StatelessSession не взаимодействует с кешем второго уровня Hibernate. При вызове методов save(), update() или delete() StatelessSession эти методы немедленно выполняют соответствующий оператор SQL, а не планируют выполнить только один оператор SQL.
StatelessSession не выполняет грязную проверку, поэтому после изменения свойств объекта Customer вам необходимо вызвать метод update() StatelessSession для обновления данных в базе данных.
StatelessSession не будет выполнять никаких каскадных операций над связанными объектами. Объект Customer с OID 1 загружается дважды через один и тот же объект StatelessSession. Адреса памяти двух полученных объектов различны.
Операции, выполняемые StatelessSession, могут быть перехвачены перехватчиком Interceptor, но будут игнорироваться системой обработки событий Hibernate.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.