English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Эта статья总结了 четыре способа решения проблемы ленивой загрузки hibernate, с которыми я сталкивался в процессе обучения.
Ленивая загрузка (lazy) - это отложенная загрузка, задержанная загрузка.
Когда использовать ленивую загрузку? Я могу ответить только: использовать ленивую загрузку тогда, когда нужно.
Почему используется ленивая загрузка? Потому что, когда объем данных, которые нам нужно получить, слишком велик, использование кэша显然 не подходит, так как объем памяти ограничен. Чтобы уменьшить количество параллельных запросов и уменьшить потребление системных ресурсов, мы загружаем данные только тогда, когда они нужны, и в этом случае мы используем ленивую загрузку.
Например, есть объект Employee и объект Department. Очевидно, для Employee по отношению к Department это много к одному, а для Department по отношению к Employee это одно к многим. Когда мы запрашиваем объект Employee, если мы хотим через атрибут department объекта employee получить соответствующий объект Department, то будет выведено исключение. Это связано с наличием ленивой загрузки, после закрытия сессии hibernate снова отправляет запрос в базу данных, и в результате возникает исключение.
Ниже приведен обзор из четырех способов решения этой проблемы:
1. Экспlicitное инициализация (внутри метода запроса)
Чтобы узнать, к какой департамент belongs определенный сотрудник, необходимо предварительно запросить Department
Используя команду
Hibernate.initialize(Department.class);
2. Редактирование файла объектно-реляционных отношений, изменение lazy на lazy=false, то есть关闭懒加载
Действительно, эти два метода могут решить проблему, но недостаток в том, что независимо от того, используется ли этот объект afterwards, Hibernate будет отправлять SQL-запросы в базу данных для запроса данных, что приводит к ненужной потере производительности.
3. Использование фильтра (веб-проект)
① Способ получения session должен использовать getCurrentSession
② Специальный способ закрытия session
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { // TODO Автоматически сгенерированный метод Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);// Запрос продолжает идти tx.commit(); } catch (Exception e) { // TODO: обработать исключение if(tx != null){ tx.rollback(); } }finally{ // Специальный способ закрытия HibernateUtil.closeCurrentSession(); } }
4. В рамке SSH используется openSessionView, предоставляемый spring
Принцип его работы аналогичен третьему методу, но этот фильтр предоставляется spring. При использовании достаточно настроить web.xml файл следующим образом:
<!-- Использование spring для решения проблемы ленивой загрузки --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Методы 3 и 4 также могут решить проблему ленивой загрузки, среди которых 4-й метод также часто используется. Однако у этих методов также есть недостатки, недостаток заключается в том, что он延长ает время закрытия сессии, увеличивая жизнь сессии. До использования этого метода сессия закрывалась после выполнения запроса; теперь, закрытие сессии происходит в конце одного веб-запроса.
Резюме
Вот все, что касается обсуждения 4 способов решения проблемы ленивой загрузки Hibernate. Надеюсь, это поможет вам. Те, кто интересуется, могут продолжить читать другие связанные темы на этом сайте. Если есть недостатки, пожалуйста, оставьте комментарий. Спасибо за поддержку сайта!
Объявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не обладает правами собственности, не underwent редактирование, и не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При обнаружении факта нарушения, сайт незамедлительно удаляет涉嫌侵权的内容.