Спечный кеш
Кэширование-это все о оптимизации производительности приложения, и оно расположено между приложением и базой данных, чтобы избежать нескольких доступа к базе данных, и позволяют критическим приложениям, критичным производительности, работать лучше.
Кэширование важно для Hibernate, и оно принимает многоуровневую схему кэширования, описанную ниже:
Кэш 1 -го уровня:
Кэш первого уровня - это кэш сеанса, который является обязательным кешем, и все запросы через него должны быть переданы. Объекты сеанса постоянно работают по объектам, прежде чем отправлять их в базу данных.
Если выпущены несколько обновлений, Hibernate пытается отложить обновления на как можно дольше, чтобы уменьшить количество выпущенных операторов SQL. Если вы закрываете сеанс, все кэшированные объекты будут потеряны, либо настойчивы, либо обновлены в базе данных.
Кэш 2 уровня:
Кэш 2 -го уровня является необязательным и кэшем уровня 1, который всегда будет искать до любой попытки найти кэш объекта 2 уровня 2. Кэш второго уровня может быть настроен на основе для каждого класса и для категории, главным образом ответственным за объекты, кэшированные в сеансе.
Любой сторонний кэш может использовать Hibernate. Интерфейс org.hibernate.cache.cacheprovider предоставляет, и необходимо реализовать реализацию кэша ручки для обеспечения Hibernate.
Кэш уровня запросов:
Hibernate также реализует жесткую интеграцию кеша результатов запроса и кэша уровня 2.
Это необязательная функция, которая требует двух дополнительных физических кэша для сохранения кэшированных результатов и регионов, когда таблица в последний раз обновляется. Это очень полезно для запросов, которые часто работают с теми же параметрами.
Кэш 2 уровня:
Hibernate использует кэш уровня 1, по умолчанию вы ничего не делаете с кэшем уровня 1. Давайте перейдем к опциональному кешу второго уровня. Не все классы извлекают выгоду из кэширования, поэтому важно отключить кэш уровня 2.
Кэш Hibernate уровня 2 установлен на два шага. Во -первых, вы должны решить, какую стратегию параллелизма использовать. После этого вы можете настроить истечение срока действия кэша и использовать кэш для обеспечения атрибутов физического кэша.
Стратегия параллелистики:
Политика параллелизма является посредником, ответственным за хранение элементов данных в кэше и получение их из кэша. Если вы хотите включить кэширование уровня 2, вам придется решить, какую политику параллелизма кэша использовать для каждого постоянного класса и сбора.
Транзакция: использование этой стратегии для в первую очередь чтение данных для предотвращения параллельных транзакций устаревших данных имеет решающее значение в редких случаях обновлений.
Read-Write: Опять же, используя эту стратегию. Основное чтение данных имеет решающее значение для предотвращения одновременных транзакций из устаревших данных в редких случаях обновлений.
НЕПРАВЛЕНИЕ-ЧИТАНСКИЙ ВИТ: Эта стратегия не гарантирует согласованность между кэшем и базой данных. С помощью этой стратегии ключ не в том, чтобы обращать внимание, если данные редко изменяются, а возможность устаревших данных должна быть устаревшей.
Только для чтения: Политика параллелистики подходит для данных и никогда не изменится. Используемые данные предназначены только для справки.
Если мы хотим использовать кэш второго уровня в качестве нашего класса сотрудников, давайте добавим элементы отображения, необходимые для того, чтобы сообщить Hibernate для использования читаемой и писательской политики кэша для экземпляров сотрудника.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "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"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping>
Свойство usage = "read-write" сообщает Hibernate использовать кэш, определяемый политикой параллелизма чтения.
Поставщик кэша:
После рассмотрения политики параллелистики вашего класса кандидата в кеш, следующим шагом является выбор поставщика кэша. Священные силы выбирают кэш для обслуживания всего приложения.
Кэш, предоставленный в указанном файле конфигурации hibernate.cfg.xml. Выберите ehcache в качестве поставщика кэша второго уровня:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.bhibernate.dialect.mysqlidialect </property> <name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-Предположим, что студенты являются названием базы данных-> <propatore = "hibernate.connection.url"> jdbc: mysql:/costhost/properation/property-fpropation/test> name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> root123 </property> <name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </propetion> <! resource = "employee.hbm.xml"/> </session-factory> </hibernate-configuration>
Теперь вам нужно указать свойства области кеша. Ehcache имеет свой собственный файл конфигурации ehcache.xml, в приложении в классе. В ehcache.xml конфигурация кэша класса сотрудников может выглядеть так:
<diskstore path = "java.io.tmpdir"/> <defaultCaccheMaxElementsInMemory = "1000" Eternal = "false" TimeDoidLeseconds = "120" TimeToliveseConds = "120" OupFlowToDisk = "true"/> <CACHE name = "employee" maxelementsinmemory = "500" eternal = "true" timeToidLeseconds = "0" timetoliveseconds = "0" upflowTodisk = "false"/>
Вот и все, теперь включите вторичный кэш и Hibernate в классе работника, теперь есть вторичный кэш, когда просмотр сотрудника или когда сотрудник загружается идентификатором.
Вы должны проанализировать все свои классы и выбрать соответствующую стратегию кэширования для каждого класса. Иногда вторичный кэш может ухудшить производительность приложения. Таким образом, это рекомендуется для эталонного приложения, которое не включает кэширование в первый раз, что очень подходит для кэширования и проверки производительности. Если кэш не улучшает производительность системы, не имеет смысла делать какой -либо тип кэша.
Кэш уровня запросов:
Используя кэш запроса, он должен быть активирован сначала в файле конфигурации свойств hibernate.cache.use_query_cache = "true". Если это свойство установлено на True, пусть Hibernate создает необходимый кэш в памяти, чтобы сохранить набор запросов и идентификатора.
Затем, используя кэш запросов, вы можете использовать метод SETCACHALE (BOOLEAN) класса запросов. Например:
Session Session = sessionFactory.Opensession (); Query Query = session.createquery ("from employee"); Query.setCachable (true); List users = Query.list (); sessionFactory.CloseSession ();Hibernate также поддерживает очень мелкозернистую поддержку кеша посредством концепции области кеша. Кэш является частью кэша, данного названием.
Session Session = sessionFactory.Opensession (); Query Query = session.createquery ("from employee"); Query.setCachable (true); Query.setCacheregion ("Сотрудник"); Список пользователей = Query.list (); SessionFactory.CloseSession ();В этом коде используется метод, чтобы сообщить Hibernate для хранения и поиска запросов на сотрудников в кэше.
Священная нативная SQL
Вы можете использовать Native SQL для выражения запросов базы данных. Если вы хотите использовать функции, специфичные для базы данных, такие как подсказки запроса или подключение ключевых слов в Oracle. Hibernate3.x позволяет использовать рукописные операторы SQL, включая хранимые процедуры, все операции создания, обновления, удаления и загрузки.
Приложение создаст собственное SQL -запрос (в интерфейсе сеанса) из метода сеанса createSqlQuery ():
public sqlquery createSqlQuery (String SqlString) бросает HibernateException
При передаче SQL -запроса методу CreateSQLQUERY () вы можете использовать метод AddENTITY (), связанный с любой существующей целевой сущностью, или скалярным результатом, используя метод AddEntity (), AddJoin () и AddScalar () метод.
Скалярное запрос:
Самым основным запросом SQL является получение списка скаляров (числовых значений) из одной или нескольких таблиц. Вот значения синтаксиса с использованием нативных скаляров SQL:
String sql = "select first_name, зарплата от сотрудника"; sqlquery Query = session.createSqlQuery (sql); Query.setResultTransformer (criteria.alias_to_entity_map); list results = Query.list ();
Запрос сущности:
Приведенные выше запросы все возвращают скалярные значения, то есть «обнаженные» данные, возвращаемые с результатов. Ниже приведено синтаксис для получения объектов объекта в целом из нативного SQL -запроса через метод AddEntity ().
String sql = "select * from employee"; sqlquery Query = session.createSqlQuery (sql); Query.Addentity (employee.class); списка результатов = Query.list ();
Названный SQL запрос:
Ниже приведен синтаксис для получения объектов объектов из собственных запросов SQL и использования именованных запросов SQL через метод AddEntity ().
String sql = "select * from employee, где id =: employee_id"; sqlquery Query = session.createSqlQuery (sql); Query.addentity (employee.class); Query.setParameter ("employee_id", 10); Перечислите результаты = Query.list (); Пример нативного SQL:
Рассмотрим следующий класс pojo:
Сотрудник открытого класса {Private Int ID; частная строка FirstName; частная строка Lastname; частный int зарплата; public employee () {} public employee (string fname, string lname, int arary) {this.firstname = fname; this.lastName = lname; это .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 Parlary; } public void setSalary (int Parlary) {this.Salary = зарплата; }}Давайте создадим следующую таблицу сотрудников для хранения объекта сотрудника:
Создание таблицы сотрудники (id int not null auto_increment, first_name varchar (20) по умолчанию NULL, last_name varchar (20) по умолчанию NULL, зарплата int по умолчанию NULL, первичный ключ (ID));
Следующие будут отображенные файлы.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "class-description"> Этот класс содержит детали сотрудника. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <name = "firstname" column = "first_name" type = "string"/> <name = "lastname" column = "last_name" type = "string"/> <propatore = "зарплата" column "type =" int "/> </> </> </> <Свойство =" зарплата "=" зарплата "=" int "/> </> </> </> </> </> </> </> </> </> <.
Наконец, мы создадим метод MAIN () класса приложения для запуска, и мы будем использовать приложения на собственных приложениях SQL:
Импорт java.util.*; Импорт org.hibernate.hibernateException; Импорт org.hibernate.session; Импорт org.hibhernate.transaction; импорт org.hibernate.sessionFactory; import org.hibernate.sqlquery; импорт org.hibernate.criteria; импорт org.hibernate.hibernate; импорт org.hibernate.cfg.configuration; открытый класс Managemopeee {Private STATIC SessionFactory Factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildsessionFactory (); } catch (throwable ex) {System.err.println ("Не удалось создать объект SessionFactory." + ex); бросить новый ExceptionInitializerError (Ex); } ManageMployee me = new ManageMployee (); / * Добавить несколько записей сотрудников в базу данных */ integer empid1 = me.addemployee ("zara", "ali", 2000); Integer EmpiD2 = me.addemployee ("Daisy", "das", 5000); Integer EmpiD3 = me.Addemployee («Джон», «Пол», 5000); Integer EmpiD4 = me.Addemployee ("Mohd", "yasee", 3000); / * Перечислите сотрудников и их зарплату с использованием скалярного запроса */ me.listemployeesscalar (); / * Перечислите полную информацию о сотрудниках, используя Entity Query */ me.listemportiesEntity (); } / * Метод для создания сотрудника в базе данных * / public Integer AddeMployee (String fname, String lname, int Parlary) {session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (fname, lname, зарплата); employeeeid = (целое число) сессия. SSAVE (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } return employeeid; } / * Метод для прочтения всех сотрудников, использующих скалярное запрос * / public void listMporteaseScalar () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); String sql = "Выберите First_Name, зарплата от сотрудника"; Sqlquery Query = session.createSqlQuery (sql); Query.SetResultTransFormer (Criteria.alias_to_entity_map); Список данных = Query.list (); for (объект объекта: data) {map row = (map) объект; System.out.print ("Имя:" + row.get ("first_name")); System.out.println (", зарплата:" + row.get ("зарплата")); } tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод для прочтения всех сотрудников, использующих Query Ontity * / public void listEmployEsEsentity () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); String sql = "select * от сотрудника"; Sqlquery Query = session.createSqlQuery (sql); Query.Addentity (employtee.class); Список сотрудников = Query.list (); for (iterator iterator = сотрудники.iterator (); iterator.hasnext ();) {employtee employee = (employtee) 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 (); }}} Скомпилируйте и выполните:
Вот шаги для компиляции и запуска вышеуказанного приложения. Пожалуйста, убедитесь, что Path и Classpath устанавливаются надлежащим образом перед компиляцией и выполнением.
Выполните бинарный файл ManageMployee для запуска программы.
Будут получены следующие результаты, и запись будет создана в таблице сотрудников.
$ java Managemployee
...... здесь будут отображаться различные сообщения журнала ......... Имя: Zara, Зарплата: 2000 Фарст Название: Дейзи, зарплата: 5000 Фарст. Мохд Фамилия: Яси зарплата: 3000
Если вы проверьте таблицу работников, она должна записать, что она имеет:
mysql> выберите * от сотрудника;
+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.