이 기사의 연구는 주로 다음과 같이 최대 절전 모드 캐시 메커니즘에 중점을 둡니다.
학생. 자바 :
공개 클래스 학생 {/*학생 ID*/개인 int ID;/*학생 이름*/개인 문자열 이름;/*학생과 수업 간의 관계*/개인 수업 수업; // 세터와 getter 방법을 생략합니다}classs.java :
공개 클래스 수업 {/*클래스 ID*/개인 int ID;/*클래스 이름*/개인 문자열 이름;/*클래스와 학생 간의 관계*/private set <tudent> 학생; // setter and getter methods}학생 .hbm.xml :
<? xml version = "1.0"?> <! doctype hibernate hibernate public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_student"> <id name = "id"> <generator // id> <!-MAP 정상 속성-> <속성 이름 = "name"/> <!-다중-하나 매핑, 다중 끝에 외국 키를 추가-> <다-하나 이름 = "class"councm "classId"/> </class apping>
class.hbm.xml :
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 이름 = "클래스"테이블 = "t_classes"lazy = "false"> <id name = "id"> <generator/generator/> </id> <속성 이름 = "name"/> <!-일대일 맵핑, inverse = "true ="true "는 동료와의 관계를 넘겨주는"true "> <classid"/>>>>>>>>>>>/> <classid "" </class> </hibernate-mapping>
첫 번째 수준 캐시의 선언 기간은 매우 짧고 세션의 수명주기는 일관됩니다. 첫 번째 레벨 캐시를 세션 수준 캐시 또는 사물 수준 캐시라고도합니다. 첫 번째 레벨 캐시는 캐시 객체이며 속성을 캐시 할 수 없습니다.
테스트 방법 (같은 세션에서로드 () 쿼리 사용) :
/*그것을 꺼낸 후에는 캐시에 배치되며 두 번째는 캐시에서 직접 검색됩니다*/ Student Student = (Student) Session.Load (Student.Class, 1); System.out.println ( "wident.name =" + whitital.getName ()); /*쿼리 명령문이 발행되지 않으며,로드는 캐시*/ 학생 = (Student) Session.Load (Student.Class, 1); System.out.println ( "wident.name =" + whitital.getName ());
참고 : 처음 쿼리하면 발견 된 결과가 세션, 캐시 및 레벨 1 캐시에 배치됩니다. Load () 이후에 제 시간에 값을 얻을 때 두 번째로 데이터베이스에서 쿼리하기 위해 명령문을 발행하지 않았지만 캐시에서 값을 직접 검색했습니다 (동일한 세션에 있어야 함).
테스트 방법 2 (같은 세션에서) :
학생 학생 = 신입생 (); student.setName ( "Zhang San"); Serializable id = session.save (학생); 학생 = (학생) 세션 .LOAD (학생 .class, id); // 저장이 Cache System.out.println을 지원하기 때문에 쿼리 문은 발행되지 않습니다 ( "withy.name =" + whening.getName ());
참고 : save () 메소드가 호출되고로드 ()가 객체를로드하는 데 사용 된 다음 이름 속성이 실제로 얻어 지지만 데이터베이스를 쿼리하기 위해 진술은 발행되지 않습니다. save () 메소드도 캐시를 지원하기 때문에.
대량의 데이터 추가를 테스트하십시오.
public void testCache7 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); for (int i = 0; i <100; i ++) {Student Student = new Student (); Student.setName ( "Zhang San" + i); 세션 .Save (학생); // (i % 20 == 0) {// 캐시를 지우고 플러시를 호출 한 후 데이터가 데이터베이스 세션에 저장됩니다. flush ()에 저장됩니다. // 캐시 된 컨텐츠 세션을 지우십시오 .Clear (); }} session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }} 메모:
1. Save () 메소드가 캐시를 지원하기 때문에 문제가 있습니다. 1 천만 조각의 데이터를 동시에 저장하려면 캐시에 1 천만 개의 캐시 객체가있어 오버플로가 발생할 수 있습니다. 따라서 Hibernate는 대규모 데이터의 업데이트 작업을 지원하지 않지만 루프를 사용하여 20 개의 데이터마다 캐시를 지우는 등이 문제를 매우 유연하게 처리 할 수 있습니다.
2. 저장, 업데이트, SaveorUpDate,로드, GET, LIST, BITERETER, 잠금 메서드는 객체를 첫 번째 수준 캐시에 넣습니다. 첫 번째 수준 캐시는 캐시 수를 제어 할 수 없으므로 큰 배치로 데이터를 작동 할 때 메모리 오버플로의 가능성에주의를 기울여야합니다. 퇴거 및 명확한 방법을 사용하여 캐시의 내용을 지우실 수 있습니다.
보조 캐시를 프로세스 레벨 캐시 또는 세션 플렉스 레벨 캐시라고도하며, 보조 캐시는 모든 세션 캐시에서 공유 할 수 있습니다. 보조 캐시의 수명주기는 SessionFactory의 수명주기와 동일합니다. SessionFactory는 보조 캐시를 관리 할 수 있습니다. 보조 캐시의 원리는 읽기보다 훨씬 큽니다. 보조 캐시는 주로 엔티티 객체를 캐시하는 데 사용됩니다.
1. ehcahe.xml 파일을 SRC 디렉토리로 복사하십시오.
2. 캐시 제품 제공 업체를 Hibernate.cfg.xml 파일에 추가하십시오.
<property name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </property>
3. 레벨 2 캐시 활성화 (기본값이 활성화되어 있기 때문에 시작을 표시 할 수 없음) : 다음과 같이.
<property name = "hibernate.cache.use_second_level_cache"> true </property>
4. 레벨 2 캐시를 사용하는 엔티티 클래스를 지정하십시오.
5. 캐시에서 사용하는 인터페이스 항아리 패키지 가져 오기 : lib/optional/ehcache/ehcache-core-2.4.3.jar
ehcache.xml 파일의 내용 :
<defaultCache MaxelementsInMemory = "10000"Eternal = "False"Timetoidleseconds = "120"Timetoliveseconds = "120"OverFlowTodisk = "True" />
메모:
1.MaxElementsInMemory는 캐시에서 가장 저장된 객체를 나타냅니다.
2.ETERNAL은 그것이 만료되지 않을지 여부를 나타냅니다 (거짓으로 설정하는 것이 더 실용적입니다. 사실이라면 결코 만료되지 않으면 다음 속성은 의미가 없습니다).
3. TimetoidleSecods는 처음 개체 후 물체가 얼마나 오래 액세스되지 않았는지를 나타냅니다.
4. TimetoliveSecods는 객체의 인벤토리 시간을 나타냅니다.
5. OverflowTodisk는 True입니다. 이는 캐시의 숫자가 MaxelementsInMemory에 의해 지정된 숫자를 초과하고 디스크에 저장됨을 의미합니다.
오버플로에 저장된 디스크 경로를 지정하십시오.
<디스크 스토어 경로 = "java.io.tmpdir"/>
참고 :이 경로는 변경 될 수 있습니다.
테스트 방법 (레벨 1 캐시의 전제는 동일한 세션에 있어야한다는 것입니다. 이제 레벨 2 캐시를 사용하여 두 개의 다른 세션에 캐시가 있는지 확인합니다).
public void testcache1 () {세션 세션 = null; try {session = hibernateutils.getsession (); session.begintransaction (); 학생) session.load (student.class, 1); system.out.println ( "Student.name =" + student.name ()); session. (예외}); {e.printstacktrace (); session.getTransaction (). rollback ();} 마침내 {hibernateutils.closesession (session);} try {session = hibernateutils.getsession (); section.begintransaction (); 학생) 세션 (학생) 세션 (Student.load, 1); 세션은 보조 캐시에서 데이터를 공유 할 수 있습니다 .// 보조 캐시는 프로세스 레벨 캐시 시스템 .out.out.println ( "학생 .name =" + Student.getName ()); session.getTransaction (). commit ();} catch (E.PrintStackTrace (); 세션. {hibernateutils.closesession (세션);}}}참고 : 보조 캐시가 구성되면 첫 번째 세션이 닫히고 다른 세션이 데이터로드로 켜져 있더라도 데이터베이스에서 데이터를 쿼리하는 문을 발행하지 않으면 보조 캐시가 구성되므로 전체 SessionFactory에서 공유됩니다.
Level 2 캐시를 비활성화하려면 대규모 배치의 데이터 추가를 구현하십시오.
public void testCache5 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); // Line-First 캐시 및 보조 캐시 상호 작용은 금지되어 있습니다. 세션 .setCacheMode (cachemode.ignore); for (int i = 0; i <100; i ++) {Student Student = new Student (); Student.setName ( "Zhang San" + i); 세션 .Save (학생); // (i % 20 == 0) {session.flush (); // 캐시 된 내용을 클리어 세션 .clear (); }} session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}참고 : session.flush ()는 첫 번째 레벨 캐시를 지우는 것을 의미하지만 두 번째 레벨 캐시를 다시 시작했으며 저장 후 () 후에도 두 번째 레벨 캐시에 저장하지만 과도한 캐시로 인해 오버플로가 있습니다. 따라서이 경우 보조 캐시를 비활성화해야합니다. session.setCacheMode (cachemode.ignore);
쿼리 캐시 : 첫 번째 레벨 캐시와 두 번째 레벨 캐시 캐시 캐시는 캐시 엔티티 객체 모두 모두 특정 속성을 얻고 데이터베이스에 자주 액세스하지 않기를 희망하지만 캐시에서 얻을 수 있기를 바랍니다. 현재 쿼리 캐시를 사용할 수 있습니다. 또한 엔티티 객체의 쿼리 캐시 결과 세트는 ID를 캐시합니다. 쿼리 캐시의 수명주기가 변경됩니다. 관련 테이블이 수정되면 쿼리 캐시의 선언주기가 끝나고 세션의 수명주기와 관련이 없습니다.
1. 쿼리 캐시를 활성화하려면 hibernate.cfg.xml 파일을 수정하십시오. False가 기본값 인 경우 활성화되지 않습니다. 다음과 같이 설정해야합니다.
<속성 이름 = "hibernate.cache.use_query_cache"> true </property>
2. 프로그램에서 다음과 같은 다음과 같은 프로그램에서 활성화되어야합니다.
query.setCachable (true)
테스트 방법 :
public void testcache2 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); list names = session.createquery ( "student s에서 s.name select s.name) .setCachable (true); for (int i = 0; i <names.size (); i ++). (string) names.get (i); system.out.println (name);} session.getTransaction (). commit ();} catch (예외 e) {e.printstacktrace (); session.getTransaction (). rollback ();} {HibernateUtils.closeSession(session);}System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .list (); for (int i = 0; i <names.size (); i ++) {String name = (string) names.get.get (i); system.out.println (name);} session.getTransaction (). commit ();} catch (예외 e) {e.printstacktrace (); session.getTransaction (); rollback (); {hibernateutils.closesession (세션);}}}참고 : 위의 코드에서는 보조 캐시를 끄고 쿼리 캐시를 끄고 일반 속성을 쿼리합니다. 테스트 코드를 실행하면 첫 번째 세션에서 첫 번째 쿼리가 문을 발행 한 다음 세션을 닫은 다음 두 번째 세션에서 쿼리를 찾을 수 있습니다. 두 번째 세션의 쿼리가 문을 발행하지 않음을 알게 될 것입니다. 이는 쿼리 캐시가 세션의 수명주기와 관련이 없음을 의미합니다.
Hibernate.cfg.xml의 캐시 구성 :
<!-보조 캐시를 지정하기위한 구현 인터페이스 설정-> <속성 이름 = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcacheregionfactory </property> <!-secondary cache에 사용되는 구성 파일을 설정하십시오-> <속성. name = "net.sf.ehcache.configurationResourcename">/ehcache.xml </property> <!-쿼리를 사용하여 캐시를 설정합니다-> <property name = "hibernate.cache.use_query_cache"> true </property> <!-객체 관계 맵핑 파일을로드합니다. resource = "com/lixue/bean/student.hbm.xml"/> <!-레벨 2 캐시를 사용하여 엔티티 클래스를 설정하기 전에 리소스 매핑 파일 (즉, 엔터티 매핑 파일)을 도입해야합니다.> <class-cache usage = "read-only"/>
위의 내용은 최대 절전 모드 캐시 메커니즘의 코드 분석에 대한이 기사의 모든 내용이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!