В этой статье описывается технология кэширования в рамках Hibernate. Поделитесь этим для вашей ссылки, следующим образом:
Кэш платформы Hibernate делится на кэш сеанса и кэш SessionFactory, также известный как кэш 1 -го уровня и кэш 2 -го уровня.
Кэш 1 -го уровня:
Кэш 1-го уровня-это кэш на уровне сеанса, который имеет короткий жизненный цикл, соответствует сеансу, управляется Hibernate и является кэшем по всей транзакции. Когда программа вызывает метод сеанса load (), метод () метод save (), метод SaveorUpdate (), метод Update () или метод интерфейса запроса, Hibernate будет кэшировать объект объекта; Когда объект объекта запросил метод нагрузки () или метод get (), Hibernate будет сначала запросить в кэше. Только когда объект объекта не может быть найден, Hibernate выпустит операторы SQL для запроса в базе данных, тем самым повысив эффективность использования Hibernate.
Например:
пакет com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (string [] args) {session = null; try {session = hibernateutil.getsession (); // Get Sessionsion.BeginTransaction (); // включить систему транзакций.out.println ("Первый запрос:"); User user = (user) session.get (user.class, new Integer (1)); System.out.println ("username:" + user.getName ()); System.out.println ("Второй запрос:"); user user1 = (user). user1.getName ()); session.getTransaction (). Commit ();} Catch (Exception e) {e.printStackTrace (); // Ошибка откинет обратно сеанс транзакции.Когда программа сначала проверяет пользовательский объект с помощью метода get (), Hibernate выпустит оператор SQL для запроса. В настоящее время Hibernate выполняет кэш первого уровня в своем пользовательском объекте; При снова запрашивая метод get (), Hibernate не выпустит оператор SQL, поскольку имя пользователя уже существует в кэше первого уровня. Результаты запуска программы:
Первый запрос: hibernate: selectUser0_.id as id0_0_, user0_.name как name0_0_, user0_.sex как sex0_0_ fromtb_user_info user0_ whereuser0_d =?
Примечание. Жизненный цикл кэша первого уровня соответствует сеансу, и он не разделяется между сеансами. В разных сессиях объекты объекта, кэшированные в других сессиях, не могут быть получены.
Кэш 2 уровня:
Кэш второго уровня-это кэш сеанса-фактического уровня, и его жизненный цикл согласуется с SessionFactory. Вторичный кэш может быть разделен между несколькими сеансами и представляет собой общеобразовательный или кластерный кэш.
Кэш уровня 2-это подключаемый плагин кэша, и его использование требует поддержки сторонних продуктов кэша. В рамках Hibernate политика использования вторичного кэша настроена через файл конфигурации Hibernate.
1. Добавить файл конфигурации кэша ehcache.xml
<ehcache> <! - Устанавливает путь к каталогу, где создаются файлы кэша .data. Если путь - это свойство системы Java. Он заменяется значением Byits в запущенном Vm. Следующие свойства переводя path = "java.io.tmpdir"/> <!-Конфигурация кэша по умолчанию. Они будут применены к кэшам, программированным образом создаваемым через Cachemanager. Следующие атрибуты необходимы для defaultCache: MaxinMemory - устанавливает максимальное количество объектов, которые будут созданы в MemoryTernal - устанавливает, являются ли элементы вечными. Если вечные, тайм -ауты игнорируются, а elementis никогда не истекает. Timetoidleseconds - устанавливает время для простоя для элемента до истечения срока его действия. Используется только, если элемент не вечен. Время холостого хода сейчас - последнее доступ к временной секунды - устанавливает время для жизни для элемента, прежде чем он истекает. Используется только, если элемент не вечен. TTL теперь-TimeOverflowTodisk-устанавливает, могут ли элементы переполняться на диск, когда CacheHas в памяти достигли предела MaxInmemory .--> <defaultCachemaxElementsInMemory = "10000" Eternal = "false" TimeoDleseconds = "120" timetoliveSeconds = "120" upflowTodeSeconds = "120" Кэши. Добавьте здесь настройки конфигурации кэша. Если у вас нет конфигурации для вашего кэша, предупреждение будет выдано, когда TheCacheManager запускает следующие атрибуты для DefaultCache: Имя - Устанавливает имя кэша. Это используется для идентификации кэша. Он должен быть уникальным. MAXINMEMORY - Устанавливает максимальное количество объектов, которые будут созданы в MemoryTernal - устанавливает, являются ли элементы вечными. Если вечные, тайм -ауты игнорируются, а elementis никогда не истекает. Timetoidleseconds - устанавливает время для простоя для элемента до истечения срока его действия. Используется только, если элемент не вечен. Время холостого хода сейчас - последнее доступ к временной секунды - устанавливает время для жизни для элемента, прежде чем он истекает. Используется только, если элемент не вечен. TTL теперь-TimeOverflowTodisk-устанавливает, могут ли элементы переполняться на диск, когда кэш-ход в памяти достигнет предела Максинмемории .--> <!-Кэш выборки с именем SampleCache1this Cacch содержит максимум в памяти 10000 элементов, и будет истекать, если это будет в течение более 5 минут, а более чем 10 минут. к кэше thedisk, который в этой конфигурации пойдет туда, где java.io.tmp определяется в вашей системе. В стандартной системе Linux это будет /tmp "-> <cache name =" samplecache1 "maxelementsinmemory =" 10000 "eternal =" false "dimehedoleseconds =" 300 "timetoliveseconds =" 600 "overflowtodisk =" true " /> <!-выборки Cache intecache2this cache cache containts intements. не истекло.
2. Установите файл конфигурации Hibernate.
<!-Включить кэш 2 уровня 2-> <name = name = "hibernate.cache.use_second_level_cache"> true </property> <!-Укажите провайдер продукта кэша-> <name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcachepRovider </propertive> <proviser> <proviser> <! Cache ---> <class-cache usage = "только для чтения"> </class-cache>
пример:
пакет com.xqh.util; import org.hibernate.session; import com.xqh.model.user; открытый тест класса {public static void main (string [] args) {session session = null; // First Sessiontry {session = hibernateUtil.getSession (); session.beginTransaction (); System.out.println («Первый запрос:»); пользователь пользователь = (пользователь) session.get (user.class, 1); System.out.println («Имя пользователя:« + user.getName (); {e.printStackTrace (); // Ошибка откатается обратно сеанс транзакции.getTransaction (). rolback ();} наконец {// закрыть объект сеанса hibernateUtil.closesession (session);} try {session = hibernateutil.getsession (); // Включить второй сеанс кэша.beginTransaction (); System.out.println («Второй запрос:»); пользователь пользователь = (пользователь) session.get (user.class, 1); System.out.println ("username:" + user.getName ()); session.getTransaction (). Транзакция Session.getTransaction (). Rollback ();} наконец {// Закройте объект сеанса hibernateUtil.closesession (session);}}}Вторичный кэш используется между сеансами, поэтому один и тот же объект может быть загружен в разные сеансы. Hibernate выпустит только одно заявление SQL. Когда объект загружен во второй раз, Hibernate получит этот объект из кэша.
Результаты программы:
Первый запрос: hibernate: selectUser0_.id as id0_0_, user0_.name как name0_0_, user0_.sex как sex0_0_ fromtb_user_info user0_ whereuser0_d =?
Для кэша L2 могут использоваться некоторые редко обновленные данные или ссылочные данные, и в настоящее время их производительность будет значительно улучшена. Однако, если часто изменяющиеся данные используются для кэша L2, производительность вызовет определенные проблемы.
Я надеюсь, что описание в этой статье будет полезно для каждого Java -программирования на основе пластинга Hibernate.