冬眠キャッシュ
キャッシュはアプリケーションのパフォーマンスの最適化に関するものであり、複数のデータベースアクセスを回避し、パフォーマンスが批判的なアプリケーションをより良くするために、アプリケーションとデータベースの間に配置されます。
キャッシュは冬眠にとって重要であり、以下に説明するマルチレベルのキャッシュスキームを採用しています。
レベル1キャッシュ:
最初のレベルのキャッシュはセッションキャッシュであり、これは必須のキャッシュであり、それを介したすべての要求は渡す必要があります。セッションオブジェクトは、データベースに送信する前に、常にオブジェクトによって搭載されています。
複数の更新が発行された場合、Hibernateは、SQLステートメントを発行した更新の数を減らすために、可能な限り更新を遅らせようとします。セッションを閉じると、すべてのキャッシュされたオブジェクトが永続的であるか、データベースで更新されます。
レベル2キャッシュ:
レベル2キャッシュはオプションであり、レベル1のキャッシュは、オブジェクトのレベル2キャッシュを見つける前に常に求められるものです。 2番目のレベルのキャッシュは、セッションでキャッシュされたオブジェクトの主に責任を負うクラスごとのカテゴリごとに構成できます。
サードパーティのキャッシュは、冬眠を使用できます。 org.hibernate.cache.cacheproviderインターフェイスは提供されており、冬眠を提供するためのハンドルキャッシュ実装を実装する必要があります。
クエリレベルキャッシュ:
Hibernateは、クエリ結果セットキャッシュとレベル2キャッシュの緊密な統合も実装しています。
これは、テーブルが最後に更新されたときにキャッシュされたクエリの結果と領域を保存するために2つの追加の物理的キャッシュを必要とするオプションの機能です。これは、同じパラメーターでしばしば実行されるクエリに非常に役立ちます。
レベル2キャッシュ:
Hibernateはレベル1キャッシュを使用します。デフォルトでは、レベル1キャッシュでは何もしません。オプションの第2レベルのキャッシュに直接行きましょう。すべてのクラスがキャッシュの恩恵を受けるわけではないため、レベル2キャッシュを無効にすることが重要です。
Hibernateレベル2キャッシュは2つのステップに設定されています。まず、どの並行性戦略を使用するかを決定する必要があります。この後、キャッシュの有効期限を構成し、キャッシュを使用して物理キャッシュ属性を提供できます。
並行戦略:
並行性ポリシーは、データ項目をキャッシュに保存し、キャッシュから取得するメディエーターです。レベル2のキャッシュを有効にする場合は、永続的なクラスとコレクションごとに使用するCachcurrencyポリシーを決定する必要があります。
トランザクション:この戦略を使用して主にデータを読み取り、時代遅れのデータの同時トランザクションを防ぐことは、まれな更新の場合に重要です。
読み取り - write:繰り返しますが、この戦略を使用して、データの主な読み取りは、まれな更新の場合に古いデータからの同時トランザクションを防ぐために重要です。
nonctrict-read-write:この戦略は、キャッシュとデータベースの一貫性を保証するものではありません。この戦略では、データがめったに変更されず、古いデータの可能性が古くする場合、重要なことは注意を払わないことです。
読み取り専用:並行性ポリシーはデータに適しており、決して変更されません。使用されるデータは参照用です。
2番目のレベルのキャッシュを従業員クラスとして使用する場合は、従業員のインスタンスに読みやすく書かれたキャッシュポリシーを使用するように冬眠に指示するために必要なマッピング要素を追加しましょう。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <cache usage = "read-write"/> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstname" column = "first_name" type = "string"/> <プロパティ名= "lastName" column = "last_name" type = "" int "int" colum " </class> </hibernate-mapping>
usage = "read-write"プロパティは、hibernateに、読み取りワイトの並行性ポリシーで定義されたキャッシュを使用するように指示します。
キャッシュプロバイダー:
キャッシュ候補クラスの並行性ポリシーを検討した後、次のステップはキャッシュプロバイダーを選択することです。冬眠は、アプリケーション全体にサービスを提供するためにキャッシュを選択します。
指定されたhibernate.cfg.xml構成ファイルで提供されるキャッシュ。第2レベルのキャッシュプロバイダーとしてehcacheを選択します。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" "> <hibernate-configuration> org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <! - 学生はデータベース名です - > <プロパティname = <hibernate.connection.url " name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> root123 </property> <Property name = "hibernate.cache.provider_class"> org.hibernate.cache.cache.ehcacheprovider < resource = "Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
これで、キャッシュ領域のプロパティを指定する必要があります。 Ehcacheには、ClassPathのアプリケーションに独自の構成ファイルehcache.xmlがあります。 ehcache.xmlでは、従業員クラスのキャッシュ構成が次のようになる場合があります。
<diskstore path = "java.io.tmpdir"/> <defaultcachemaxelementsinmemory = "1000" eterinal = "false" false "TimetoidLeseConds =" 120 "TimetoliveseConds =" 120 "Overflowtodisk =" true "/> <cache name = "Employee" MaxElementsInmemory = "500" ETERNAL = "TRUE" TIMETOIDLESECONDS = "0" TIMETOLIVESCONDS = "0" OVERFLOWTODISK = "FALSE"/>
それだけで、従業員に閲覧するたびに、または従業員が識別子によってロードされたときに、従業員クラスのセカンダリキャッシュと冬眠がセカンダリキャッシュを実現できるようになりました。
すべてのクラスを分析し、各クラスの適切なキャッシュ戦略を選択する必要があります。場合によっては、セカンダリキャッシュがアプリケーションのパフォーマンスを低下させる場合があります。そのため、キャッシュとチェックのパフォーマンスに非常に適したキャッシュを初めて有効にしないベンチマークアプリケーションに推奨されます。キャッシュがシステムのパフォーマンスを改善しない場合、あらゆる種類のキャッシュを作成することは意味がありません。
クエリレベルキャッシュ:
クエリキャッシュを使用すると、最初にhibernate.cache.use_query_cache = "true"プロパティ構成ファイルでアクティブにする必要があります。このプロパティがtrueに設定されている場合は、クエリと識別子セットを保存するために、メモリに必要なキャッシュをHibernateに作成させます。
次に、クエリキャッシュを使用して、クエリクラスのセットキャッチ可能な(ブール)メソッドを使用できます。例えば:
session session = sessionfactory.opensession(); query query = session.createquery( "from Employee"); query.setCachaible(true); list users = query.list(); sessionfactory.closessess();
Hibernateは、キャッシュ領域の概念を通じて非常に細かいキャッシュサポートもサポートしています。キャッシュは名前が与えられたキャッシュの一部です。
セッションセッション= sessionfactory.opensession(); query query = session.createquery( "from Employee"); query.setCachaible(true); query.setCacheregion( "Employee"); list users = query.list(); sessionFactory.Closessess();
このコードは、Hibernateにキャッシュ内の従業員のクエリを保存して見つけるように指示する方法を使用します。
冬眠ネイティブSQL
ネイティブSQLを使用して、データベースクエリを表現できます。クエリプロンプトやOracleのキーワードを接続するなど、データベース固有の機能を使用する場合。 hibernate3.xでは、ストアドプロシージャ、すべての作成、更新、削除、ロード操作など、手書きのSQLステートメントを使用できます。
アプリケーションは、セッションCreateSQLQuery()メソッドからネイティブSQLクエリ(セッションインターフェイス)を作成します。
Public SQlQuery CreateSQlQuery(String SQLString)は、冬眠exceptionをスローします
SQLクエリをcreateSQLQuery()メソッドに渡す場合、既存の冬眠エンティティに関連付けられたaddentity()メソッド、またはaddentity()メソッド、addjoin()、およびaddscalar()メソッドを使用してスカラー結果を使用できます。
スカラークエリ:
最も基本的なSQLクエリは、1つ以上のテーブルからスカラー(数値)のリストを取得することです。ネイティブSQLスカラーを使用した構文の値は次のとおりです。
string sql = "Select first_name、従業員からの給与"; sqlquery query = session.createsqlquery(sql); query.setresulttransformer(criteria.alias_to_entity_map); list results = query.list();
エンティティクエリ:
上記のクエリは、すべてのリターンスカラー値、つまり結果セットから返された「裸の」データです。以下は、addentity()メソッドを介してネイティブSQLクエリからエンティティオブジェクト全体を取得する構文です。
string sql = "select * from Employee"; sqlquery query = session.createsqlquery(sql); query.addentity(employee.class); list results = query.list();
名前付きSQLクエリ:
以下は、ネイティブSQLクエリからエンティティオブジェクトを取得し、addentity()メソッドを介して名前付きSQLクエリを使用する構文です。
string sql = "select * from Employee where id =:employee_id"; sqlquery query = session.createsqlquery(sql); query.addentity(employee.class); query.setParameter( "Employee_id"、10); list results = query.list();
ネイティブSQLの例:
次のPojoクラスを検討してください。
パブリッククラスの従業員{private int id;プライベート文字列firstName;プライベート文字列lastName;プライベート給与; public Employee(){} public Employee(string fname、string lname、int salary){this.firstname = fname; this.lastname = lname; this.salary = 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(){return Salary; } public void setSalary(int salary){this.salary = salary; }}次の従業員テーブルを作成して、従業員オブジェクトを保存しましょう。
Table Employeeの作成(ID int not null auto_increment、first_name varchar(20)デフォルトnull、last_name varchar(20)デフォルトnull、salary int default null、primary key(id));
以下はマッピングされたファイルになります。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <プロパティ名= "lastName" colummen = "last_name" type = "string"/> <プロパティ名= "salary" columer "int" int "int"/fiver>> <
最後に、実行するアプリケーションクラスのメイン()メソッドを作成し、ネイティブSQLクエリアプリケーションを使用します。
Java.util。*をインポートします。 org.hibernate.hibernateExceptionをインポートします。 org.hibernate.sessionをインポートします。 Import org.hibernate.transaction; Import org.hibernate.sessionfactory; Import org.hibernate.sqlquery; Import org.hibernate.criteria; Import org.hibernate.cfg.configuration;公的クラスの管理具体的なセッション事実上の事実; public static void main(string [] args){try {factory = new configuration()。configure()。buildSessionFactory(); } catch(throwable ex){system.err.println( "SessionFactoryオブジェクトの作成に失敗しました。" + ex);新しい例外initializererror(ex); } managemployee me = new Managemployee(); / *データベースに少数の従業員レコードを追加 */ integer empid1 = me.addemployee( "zara"、 "ali"、2000); integer empid2 = me.addemployee( "daisy"、 "das"、5000); Integer Empid3 = me.addemployee( "John"、 "Paul"、5000); integer empid4 = me.addemployee( "mohd"、 "yasee"、3000); / * Scalar Queryを使用して従業員とその給与をリストダウンします */ me.listemployeEsscalar(); / * Entity Queryを使用して従業員の完全な情報をリストダウンします */ me.listemployeesEntity(); } / *データベースで従業員を作成する方法 * / public Integer addemployee(string fname、string lname、int salary){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員従業員=新しい従業員(FNAME、LNAME、SALARY); EmployeeId =(integer)session.save(Employee); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); } employeedを返します。 } / *スカラークエリを使用してすべての従業員を読む方法トランザクションTx = null; try {tx = session.begintransaction();文字列sql = "first_nameを選択し、従業員から給与を選択します"; sqlquery query = session.createsqlquery(sql); query.setresulttransformer(criteria.alias_to_entity_map);リストデータ= query.list(); for(オブジェクトオブジェクト:data){map row =(map)object; System.out.print( "名:" + row.get( "first_name")); System.out.println( "、salary:" + row.get( "salary")); } tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *エンティティqueryを使用してすべての従業員を読み取る方法 * / public void listemployeEsentity(){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction();文字列sql = "select * from Employee"; sqlquery query = session.createsqlquery(sql); query.addentity(employee.class);従業員= query.list(); for(iterator iterator = employes.iterator(); iterator.hasnext();){従業員=(従業員)iterator.next(); System.out.print( "名:" + employee.getFirstName()); System.out.print( "last Name:" + Employee.getLastName()); System.out.println( "salary:" + employee.getSalary()); } tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }}}コンパイルと実行:
上記のアプリケーションをコンパイルして実行する手順は次のとおりです。コンパイルして実行する前に、パスとクラスパスが適切に設定されていることを確認してください。
managemployeeのバイナリファイルを実行して、プログラムを実行します。
次の結果が得られ、記録は従業員のテーブルに作成されます。
$ Java Managemployee
......さまざまなログメッセージがここに表示されます......... Zara、給与:2000ファースト名:デイジー、給与:5000ファースト名:ジョン、給与:5000ファースト名:5000ファースト名:3000ファーストネーム:Zara姓:Ali給与:2000ファースト名:Dais姓:5000first mopht:5000first mophprs姓:Yasee Salary:3000
従業員のテーブルをチェックする場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------