최대 절전 모드 캐시
캐싱은 애플리케이션의 성능 최적화에 관한 것이며 응용 프로그램과 데이터베이스 사이에 여러 데이터베이스 액세스를 피하고 성능 크리티컬 애플리케이션이 더 나은 성능을 발휘할 수 있도록합니다.
캐싱은 최대 절전 모드에 중요하며 아래에 설명 된 다단계 캐싱 체계를 채택합니다.
레벨 1 캐시 :
첫 번째 레벨 캐시는 세션 캐시이며 필수 캐시이며 모든 요청을 통과해야합니다. 세션 객체는 데이터베이스에 제출하기 전에 객체에 의해 지속적으로 전원을 공급받습니다.
여러 업데이트가 발행되면 최대 절전 모드는 발행 된 SQL 문의 업데이트 수를 줄이기 위해 가능한 한 오랫동안 업데이트를 지연 시키려고 시도합니다. 세션을 닫으면 모든 캐시 된 객체가 데이터베이스에서 영구적이거나 업데이트됩니다.
레벨 2 캐시 :
레벨 2 캐시는 옵션의 레벨 2 캐시를 찾기 전에 항상 찾는 옵션 및 레벨 1 캐시입니다. 두 번째 레벨 캐시는 수업 별 및 범주별로 구성 할 수 있으며, 주로 세션에서 캐시 된 객체를 담당합니다.
모든 타사 캐시는 최대 절전 모드를 사용할 수 있습니다. org.hibernate.cache.cacheprovider 인터페이스는 제공하며 최대 절전 모드를 제공하기위한 핸들 캐시 구현을 구현해야합니다.
쿼리 레벨 캐시 :
Hibernate는 또한 쿼리 결과 세트 캐시 및 레벨 2 캐시의 엄격한 통합을 구현합니다.
캐시 된 쿼리 결과를 저장하기 위해 두 개의 추가 물리적 캐시와 테이블이 마지막으로 업데이트 될 때 영역을 저장 해야하는 옵션 기능입니다. 이것은 종종 동일한 매개 변수로 실행되는 쿼리에 매우 유용합니다.
레벨 2 캐시 :
Hibernate는 레벨 1 캐시를 사용합니다. 기본적으로 레벨 1 캐시로 아무것도하지 않습니다. 옵션 두 번째 레벨 캐시로 바로 가자. 모든 클래스가 캐싱으로 인한 혜택을받는 것은 아니므로 레벨 2 캐시를 비활성화하는 것이 중요합니다.
최대 절전 모드 레벨 2 캐시가 두 단계로 설정됩니다. 먼저 사용할 동시성 전략을 결정해야합니다. 그런 다음 캐시 만료를 구성하고 캐시를 사용하여 물리적 캐시 속성을 제공 할 수 있습니다.
동시성 전략 :
동시성 정책은 캐시에 데이터 항목을 저장하고 캐시에서 검색하는 중재자입니다. 레벨 2 캐싱을 활성화하려면 각 영구 클래스 및 컬렉션에 사용할 캐시 동시성 정책을 결정해야합니다.
트랜잭션 :이 전략을 사용하여 구식 데이터의 동시 트랜잭션을 방지하기 위해 주로 데이터를 읽는 것이 드문 업데이트의 경우 중요합니다.
읽기 쓰기 :이 전략을 사용 하여이 전략을 사용하여 드문 업데이트의 경우 동시 트랜잭션이 오래된 데이터에서 동시 거래를 방지하는 데 중요합니다.
NAMPLEST-READ-WRITE :이 전략은 캐시와 데이터베이스 간의 일관성을 보장하지 않습니다. 이 전략을 사용하면 데이터가 거의 변경되지 않고 오래된 데이터의 가능성이 부실한 경우 핵심은주의를 기울이지 않는 것입니다.
읽기 전용 : 동시성 정책은 데이터에 적합하며 결코 변경되지 않습니다. 사용 된 데이터는 참조 용입니다.
직원 클래스로 두 번째 레벨 캐시를 사용하려면 Hibernate에 직원 인스턴스에 대한 읽기 가능하고 쓰기 쉬운 캐시 정책을 사용하도록 필요한 매핑 요소를 추가하겠습니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <cache usage = "read-write"/> <id name = "id"type = "int"column = "id"> <generator/</id> <property name = "firstname"column = "first_name"type = "string"/> <property name = "lastname"column = "last_name"type = "string" "salary"sylary "int". </class> </hibernate-mapping>
usage = "read-write"속성은 최대 절전 모드에게 읽기 작성 동시성 정책으로 정의 된 캐시를 사용하도록 지시합니다.
캐시 제공자 :
캐시 후보 클래스의 동시성 정책을 고려한 후 다음 단계는 캐시 제공 업체를 선택하는 것입니다. 최대 절전 모드 전체 애플리케이션을 제공하기 위해 캐시를 선택합니다.
지정된 hibernate.cfg.xml 구성 파일에 제공된 캐시. 두 번째 레벨 캐시 제공 업체로 ehcache를 선택하십시오.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <Session-Factory> <속성 이름 = Hibernate.dialet " org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-학생들이 데이터베이스 이름이라고 가정합니다.> <속성 이름 = "hibernate.connection.url"> 이름 = "hibernate.connection.username"> root </property> <속성 이름 = "hibernate.connection.password"> root123 </property> <property name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </property> <!- XML Mapping-mapping-mappe Resource = "Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
이제 캐시 영역의 속성을 지정해야합니다. Ehcache에는 클래스 경로 응용 프로그램에 자체 구성 파일 ehcache.xml이 있습니다. ehcache.xml에서 직원 클래스 캐시 구성이 다음과 같습니다.
<diskstore path = "java.io.tmpdir"/> <defaultCacheMaxElementsInMemory = "1000"Eternal = "False"Timetoidleseconds = "120"Timetoliveseconds = "120"OverFlowTodisk = "true"/> <Cache 이름 = "Employee"maxelementsInmemory = "500"Eternal = "true"timetoidleseconds = "0"Timetoliveseconds = "0"OverFlowTodisk = "false"/>
이제 직원에게 브라우징 할 때마다 또는 직원이 식별자로로드 될 때마다 직원 클래스의 보조 캐시 및 최대 절전 모드가 2 차 캐시를 가질 수 있습니다.
모든 클래스를 분석하고 각 클래스에 대한 적절한 캐싱 전략을 선택해야합니다. 때로는 보조 캐시가 응용 프로그램의 성능을 저하시킬 수 있습니다. 따라서 처음으로 캐싱을 가능하게하지 않는 벤치 마크 애플리케이션에 권장되며, 이는 캐싱 및 점검 성능에 매우 적합합니다. 캐시가 시스템 성능을 향상시키지 않으면 모든 유형의 캐시를 만드는 것은 의미가 없습니다.
쿼리 레벨 캐시 :
쿼리 캐시를 사용하면 hibernate.cache.use_query_cache = "true"속성 구성 파일에서 먼저 활성화해야합니다. 이 속성이 true로 설정된 경우 최대 절전 모드를 메모리에서 필요한 캐시를 작성하여 쿼리 및 식별자 세트를 저장하십시오.
다음으로 쿼리 캐시를 사용하면 쿼리 클래스의 SetCachable (부울) 메소드를 사용할 수 있습니다. 예를 들어:
세션 세션 = sessionFactory.opensession (); Query Query = session.createquery ( "from Employee"); query.setCachable (true); list users = query.list (); sessionFactory.closesessess ();
Hibernate는 또한 캐시 영역의 개념을 통해 매우 세밀한 캐시 지원을 지원합니다. 캐시는 이름이 주어진 캐시의 일부입니다.
세션 세션 = sessionFactory.Opensession (); query query = session.createquery ( "직원에서"); query.setCachable (true); query.setCacheregion ( "Employee"); list users = query.list (); sessionfactory.closesessess ();
이 코드는 메소드를 사용하여 Hibernate에게 캐시의 직원에게 쿼리를 저장하고 찾도록 지시합니다.
최대 절전균 네이티브 SQL
기본 SQL을 사용하여 데이터베이스 쿼리를 표현할 수 있습니다. Oracle에서 쿼리 프롬프트 또는 연결 키워드와 같은 데이터베이스 별 함수를 사용하려면 Hibernate3.x는 저장 프로 시저, 모든 생성, 업데이트, 삭제 및로드 작업을 포함하여 필기 된 SQL 문을 사용할 수 있습니다.
애플리케이션은 세션에서 세션 인터페이스에서 기본 SQL 쿼리 (세션 인터페이스)를 생성합니다.
public sqlquery createesqlquery (String sqlstring)는 최대 절전 모드를 던졌습니다
SQL 쿼리를 CreateSqlQuery () 메소드에 전달할 때 기존 최대 절전 모드 엔티티와 관련된 addentity () 메소드 또는 addentity () 메소드, addJoin () 및 addScalar () 메소드를 사용하여 스칼라 결과를 사용할 수 있습니다.
스칼라 쿼리 :
가장 기본적인 SQL 쿼리는 하나 이상의 테이블에서 스칼라 (숫자 값) 목록을 얻는 것입니다. 기본 SQL 스칼라를 사용한 구문의 값은 다음과 같습니다.
문자열 sql = "select first_name, 직원의 급여"; sqlquery query = session.createsqlquery (sql); query.setresulttransformer (cariteria.alias_to_entity_map); list results = query.list ();
엔티티 쿼리 :
위의 쿼리는 모든 리턴 스칼라 값, 즉 결과 세트에서 반환 된 "알몸"데이터를 쿼리합니다. 다음은 addentity () 메소드를 통해 기본 SQL 쿼리에서 전체로 엔티티 객체를 얻는 구문입니다.
문자열 SQL = "직원에서 선택 *"; SQLQuery query = session.createsQlQuery (SQL); query.addentity (Employee.class); list results = query.list ();
이름이 지정된 SQL 쿼리 :
다음은 기본 SQL 쿼리에서 엔티티 오브젝트를 얻고 Addentity () 메소드를 통해 명명 된 SQL 쿼리를 사용하는 구문입니다.
문자열 sql = "select * where id = : Employee_id"; sqlquery query = session.createsqlquery (sql); query.addentity (eployee.class); query.setparameter ( "Employee_id", 10); list results = query.list ();
기본 SQL 예 :
다음 pojo 클래스를 고려하십시오.
공공 클래스 직원 {private int id; 개인 문자열 firstName; 개인 문자열 마지막 이름; 개인 INT 급여; 공공 직원 () {} 공공 직원 (문자열 fname, 문자열 lname, int 월급) {this.firstname = fname; this.lastname = lname; this.salary = 급여; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String First_Name) {this.firstName = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {반환 급여; } public void setSalary (int 급여) {this.salary = 월급; }}직원 개체를 저장하기 위해 다음 직원 테이블을 만들어 봅시다.
테이블 직원 생성 (id int null auto_increment, first_name varchar (20) 기본 널, last_name varchar (20) 기본 널, 급여 int 기본 널, 기본 키 (id));
다음은 매핑 된 파일입니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <id name = "id"type = "int"열 = "id"> <generator/> </id> <속성 이름 = "FirstName"열 = "first_name"type = "string"/> <property name = "lastname"column = "last_name"type = "String"/> <property name = "salary"column = "int"/class> </hibernate ">
마지막으로, 실행할 응용 프로그램 클래스의 메인 () 메소드를 작성하고 기본 SQL 쿼리 응용 프로그램을 사용합니다.
java.util.*; import org.hibernate.hibernateException; import org.hibernate.session; import org.hibernate.transaction; import org.hibernate.sessionfactory; import org.hibernate.sqlquery; import org.hibernate.criteria; import org.hibernate.hibernate; import org.hibernate.cfg.configuration; public managefactory factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ( "SessionFactory 객체를 생성하지 못했습니다." + ex); 새로운 예외를 던지십시오. } manageemployee me = new manageemployee (); / * 데이터베이스에 직원 기록이 거의 없습니다. */ Integer Empid1 = Me.addemployee ( "Zara", "Ali", 2000); 정수 Empid2 = Me.addemployee ( "Daisy", "Das", 5000); 정수 empid3 = me.addemployee ( "John", "Paul", 5000); 정수 Empid4 = Me.addemployee ( "Mohd", "Yasee", 3000); / * 스칼라 쿼리를 사용하여 직원과 급여를 나열하십시오 */ me.listemployeesscalar (); / * 엔티티 쿼리를 사용하여 전체 직원 정보 나열 */ me.listemployeeEntity (); } / * 데이터베이스에서 직원을 생성하는 방법 * / public integer addemployee (String fname, String Lname, int Salary) {세션 세션 = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 직원 = 신입 사원 (fname, lname, 월급); EmployeeId = (Integer) Session.Save (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } return EmployeeId; } / * 스칼라 쿼리를 사용하여 모든 직원을 읽는 메소드 * / public void listemployeesscalar () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); 문자열 sql = "직원의 첫 번째 _name, 직원의 급여"; sqlquery query = session.createsqlquery (SQL); query.setResultTransformer (criteria.alias_to_entity_map); 목록 데이터 = query.list (); for (Object Object : data) {map row = (map) 객체; System.out.print ( "이름 :" + row.get ( "First_name")); System.out.println ( ", 급여 :" + row.get ( "Salary")); } tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 엔티티 쿼리를 사용하여 모든 직원을 읽는 방법 * / public void listemployeesentity () {세션 세션 = infactory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); 문자열 sql = "직원에서 선택 *"; sqlquery query = session.createsqlquery (SQL); query.addentity (Employee.class); list EmployES = query.list (); for (iterator iterator = Employegator (); iterator.hasnext ();) {Employee Employee = (Employee) iterator.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); } tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }}} 컴파일 및 실행 :
위의 응용 프로그램을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일 및 실행 전에 경로와 클래스 경로가 적절하게 설정되어 있는지 확인하십시오.
프로그램을 실행하려면 ManageEmployee Binary 파일을 실행하십시오.
다음 결과가 얻어지고 직원 테이블에서 기록이 작성됩니다.
$ java manageemployee
...... 다양한 로그 메시지가 여기에 표시됩니다 ......... 이름 : Zara, Salary : 2000First 이름 : Daisy, Salary : 5000 First Name : John, Salary : 5000first 이름 : Mohd, Senary : 3000First 이름 : Zara 성직 : Ali Salary : Ali Salary : 2000first 이름 : Daisy Stame : 5000 First Sonal : 5000 First. Mohd 성 : Yasee Salary : 3000
직원 테이블을 확인하면 다음과 같이 기록해야합니다.
MySQL> 직원에서 선택 *;
+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------