English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 글은 저가 hibernate를 공부하는 과정에서 hibernate 라지 로드 문제를 해결하는 네 가지 방법을 요약했습니다.
라지 로드(lazy)는 지연 로드, 지연 로드를 의미합니다.
언제 라지 로드를 사용할까요? 저는 라지 로드를 사용할 때 라지 로드를 사용한다고 대답할 수 있습니다.
데이터를 접근할 때 데이터량이 너무 많을 때는 캐시를 사용하는 것이 적합하지 않기 때문에, 메모리 용량이 제한적이어서, 동시 접근량을 줄이고 시스템 자원 소비를 줄이기 위해 데이터가 필요할 때까지 로드하지 않도록 하여, 이때는 라지 로드를 사용합니다.
예를 들어, Employee라는 객체와 Department라는 객체가 있습니다. Employee와 Department의 관계는 Employee가 Department에 대해 다대일, Department가 Employee에 대해 일대다의 관계입니다. Employee 객체를 쿼리할 때, employee 객체의 property department를 통해 해당 Department를 찾으려고 하면 예외가 발생합니다. 이는 레이지 로딩의 존재로 인해 세션을 닫은 후 Hibernate가 다시 데이터베이스로 요청을 보내서 예외가 발생하는 것입니다.
이 문제를 해결하는 네 가지 방법을 요약하겠습니다:
1.명시적 초기화(쿼리 메서드 내에서)
특정 직원이 어떤 부서에 속하는지 확인할 때, Department를 사전 조사해야 합니다
사용 문장
Hibernate.initialize(Department.class);
2.객체 관계 파일을 수정하여 lazy를 lazy=false로 변경하여 레이지 로딩을 끄기
이 두 가지 방법은 문제를 해결할 수 있지만, 단점은 이 객체를 사용하지 않았더라도 Hibernate가 데이터를 요청하는 SQL 문장을 데이터베이스로 보내어 불필요한 성능 낭비를 초래합니다.
3.웹 프로젝트에서 필터 사용
①세션을 가져오는 방식은 반드시 getCurrentSession을 사용해야 합니다
②특수한 세션 종료 방식
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(); } }
4SSH 프레임워크에서 Spring이 제공하는 openSessionView
이 방법의 원리는 제3가지 방법에서 사용한 Filter와 유사하지만, 이 filter는 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이 두 가지 방법도 현재 많이 사용되고 있습니다. 그러나 이 두 가지 방법에도 단점이 있습니다. 단점은 세션을 닫는 시간을 연장하고, 세션의 생명 주기가 길어지는 것입니다. 이 방법을 사용하기 전에는 세션이 데이터를 검색한 후에 닫혔지만, 지금은 웹 요청의 마지막에 세션이 닫힙니다.
결론
이 글은 Hibernate 레인로드에 대해 간단히 설명한 내용입니다.4이 방법의 모든 내용을 제공하여 모두에게 도움이 되길 바랍니다. 관심이 있는 분은 이 사이트의 다른 관련 주제를 계속 참조할 수 있으며, 부족한 점이 있으면 댓글을 통해 지적해 주시기 바랍니다. 친구 여러분의 이 사이트에 대한 지지에 감사드립니다!
언급: 이 글의 내용은 인터넷에서 가져왔으며, 저작권자는 본인입니다. 인터넷 사용자가 자발적으로 기여하고 업로드한 내용이며, 이 사이트는 소유권을 가지지 않으며, 인공적인 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용을 발견하면, 이메일을 보내 주시기 바랍니다: notice#oldtoolbag.com에 이메일을 보내면 (#을 @으로 변경하십시오) 신고를 하고 관련 증거를 제공하십시오. 일단 확인되면, 이 사이트는 즉시 저작권 위반 내용을 삭제합니다.