Статьи

Высокопроизводительный JPA с GlassFish и Coherence — Часть 2

Во второй части моей серии из четырех статей я расскажу о стратегии номер один по использованию Coherence с EclipseLink и GlassFish. Здесь описываются шаги, которые необходимо выполнить для настройки кэша с поддержкой JPA с Coherence, и как вы можете использовать его из GlassFish как высокопроизводительное хранилище данных.

Общий подход

Вы можете использовать Coherence API с кэшами, поддерживаемыми базой данных, отображаемой через JPA. Сетка обращается к реляционным данным через реализации JPA CacheLoader и CacheStore. В этом «традиционном» подходе Coherence TopLink Grid предоставляет реализации CacheLoader и CacheStore, оптимизированные для EclipseLink JPA. (EclipseLinkJPACacheLoader и EclipseLinkJPACacheStore), которые содержатся в файле toplink-grid.jar. Таким образом, вы используете стандартный файл конфигурации JPA времени выполнения persistence.xml и файл отображения JPA orm.xml. Файл конфигурации кэша Coherence coherence-cache-config.xml должен быть указан для переопределения настроек Coherence по умолчанию и определения схемы кэширования CacheStore.

подробности

Реализация CacheLoader перенаправляет все операции чтения / запросы непосредственно в базу данных через EclipseLink. CacheStore заботится обо всех операциях записи (вставка, обновление, удаление), которые выполняются для базы данных с использованием EclipseLink. Это решение в основном не зависит от GlassFish и его поставщика JPA. Вы просто используете Coherence с его собственным API, а Coherence заботится о сохранении сущностей. Этот подход называется «Конфигурация традиционной когерентности» в документации.

подготовка

Чтобы заставить этот и каждый из следующих примеров работать, нам нужно сделать некоторые приготовления. Первый — получить все необходимое программное обеспечение. Получите свою копию Java SE Development Kit 6u23 , GlassFish 3.1 (часть NetBeans) , MySQL Community Server (5.5.9) , TopLink (11.1.1.4.0) и Coherence (3.6.1.0) . Любая IDE будет работать. Я основал все примеры на NetBeans 7.0 Beta2 . Вы должны начать с установки кусочков. Создайте пустую базу данных «согласованности» с MySQL. Мы будем использовать это для всех примеров. Я НЕ буду вести вас через это. Я начну с соответствующих частей Coherence. Это будет конфигурация, в которой вы должны следовать и другим частям этой серии. Так что лучше держи это;)

Разархивируйте загрузку Coherence в подходящее место (например, x: \ Oracle \ coherence \) и проверьте установку, настроив и запустив пример приложения-сервера кеша. Перейдите в папку \ bin и запустите cache-server.cmd / sh. Перед этим убедитесь, что переменная JAVA_HOME указывает на допустимую установку JDK. Если все прошло гладко, вы получите сообщение: «Запущен DefaultCacheServer…». Одно простое примечание: когерентность учитывает кластеры. Это означает, что он автоматически пытается обнаружить другие работающие узлы Coherence в вашей подсети. Если вы видите какой-либо другой вывод, кроме «ActualMemberSet = MemberSet (Size = 1»), вам следует остановиться здесь и настроить Coherence для работы только на вашем компьютере . Отлично. Все готово. Пойдем и выполним пример клиента. Запустите coherence.cmd / sh и дождитесь вывода «Map (?):». Если вы вернетесь к консоли сервера, вы увидите что-то вроде этого:

1
(thread=Cluster, member=1): Member 2 joined Service Management with senior member 1

Поэкспериментируйте с ним и попробуйте следующие команды, каждая из которых подтверждена return: help, кешируйте myCache, поместите сообщение «привет», получите сообщение, размер, список, пока. Для получения дополнительной помощи, пожалуйста, обратитесь к учебнику .

Переместить это на практике

Начните новый проект библиотеки классов Java / Java с помощью NetBeans. Назовите его «GridEntityExample» (установите флажок в выделенной папке lib). Добавьте coherence.jar, toplink-grid.jar и mysql-connector-java-5.1.13-bin.jar в папку lib и добавьте их в зависимости проектов.

Добавьте два новых объекта и сервер (например, net.eisele.coherence.entities, net.eisele.coherence.server) и

Поскольку у нас уже есть пример кеш-сервера, его легко изменить в соответствии с нашими потребностями. Добавьте новый класс сущностей (Employee) в пакет сущностей. Измените тип первичного ключа на «int» и нажмите «Далее». Выберите EclipseLink JPA 2.0 из выпадающего списка. Поскольку мастер не даст вам завершить работу, создайте новое соединение с базой данных (jdbc: mysql: // localhost: 3306 / coherence) и нажмите кнопку «Готово». Добавьте две частные строки (firstName, lastName) и их получатели и установщики к сущности. Удалите @GeneratedValue из атрибута id (подробнее об этом позже). Некоторые изменения в файле persistence.xml завершают настройку. Добавьте следующее:

01
02
03
04
05
06
07
08
09
10
11
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />           
<property name="eclipselink.jdbc.read-connections.min" value="1" />
<property name="eclipselink.jdbc.write-connections.min" value="1" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.thread" value="false" />
<property name="eclipselink.logging.session" value="false" />
<property name="eclipselink.logging.exceptions" value="false" />
<property name="eclipselink.logging.timestamp" value="false"/>

Теперь нам нужен простой класс StartCacheServer, который должен сопротивляться в пакете сервера. Дайте ему простой основной метод:

1
2
3
4
5
6
7
public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());
 
// Start CacheServer
DefaultCacheServer.main(new String[0]);
}

Теперь нам нужно настроить Coherence. Это делается с помощью файла coherence-cache-config.xml. Полный файл можно найти в учебнике . Ключом к успеху является второй init-параметр для схемы классов. Вы должны сослаться на модуль постоянства из файла persistence.xml:

1
2
3
4
<init-param>
<param-type>java.lang.String</param-type>
<param-value>GridEntityExamplePU</param-value>
</init-param>

Щелкните правой кнопкой мыши StartCacheServer и запустите его. Вы должны увидеть уже известное сообщение: «Запущен DefaultCacheServer…».

ОК. Теперь мы собираемся вставить нашего первого сотрудника в базу данных. Создайте простой класс InsertExample:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());
 
// Disable local storage--need to start independent CacheServer
System.setProperty("tangosol.coherence.distributed.localstorage", "false");
 
// Get the configured Cache
NamedCache cache = CacheFactory.getCache("Employee");
 
//Create a new Employee
Employee emp = new Employee();
emp.setFirstName("Markus");
emp.setLastName("Eisele");
emp.setId(1);
 
//Put the Employee into the cache
cache.put(1, emp);
}

Запустите его и проверьте с помощью вашей базы данных, есть ли недавно созданный сотрудник. Так должно быть ?

Готово. Это все. Хорошо, где именно часть GlassFish?

Используя этот подход с GlassFish

Это просто как ад. Создайте новый домен (назовем его согласованным) и создайте новое веб-приложение (назовем его GridEntityWeb). Добавьте проект GridEntityExample и файл coherence.jar в качестве зависимостей. Теперь вам нужно настроить кеш. Это делается снова через coherence-cache-config.xml. Создайте его в WEB-INF / classes и сделайте так, чтобы он ссылался на имя службы EclipseLinkJPA.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<cache-config>
 
<caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>distributed-eclipselink</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
 
<caching-schemes>
<distributed-scheme>
<scheme-name>distributed-eclipselink</scheme-name>
<service-name>EclipseLinkJPA</service-name>
</distributed-scheme>
</caching-schemes>
 
</cache-config>

Это все. Убедитесь, что StartCacheServer запущен и запустите ваш домен GlassFish вместе с вашим приложением. Если вы просто скопируете несколько строк из InsertExample, вы сможете быстро проверить, все ли работает. Теперь осталось только найти хороший и понятный способ интегрировать это в ваше приложение. Возможно, вы могли бы придумать общий сервис Coherence Crud (вероятно, по предложению Адама )

Недостатки и мысли

При использовании этого подхода важно настроить модуль сохранения, чтобы гарантировать, что никакие изменения не будут внесены в объекты, когда они вставляются или обновляются. Любые изменения, внесенные в сущности поставщиком JPA, не отражаются в кэше Coherence. Это означает, что объект в кэше не будет соответствовать содержимому базы данных. В частности, сущности не должны использовать генерацию идентификатора, например @GeneratedValue, для получения идентификатора. Это означает, что для того, чтобы вставить объект в кэш Coherence, вам также необходимо указать его идентификатор, который будет служить ключом.

Идентификатор, как правило, является ключом, под которым объект сохраняется в Coherence. Оптимистическая блокировка (например, @Version) не должна использоваться, так как это может привести к ошибке фиксации транзакции базы данных.

Так что в целом это не очень распространенный подход, который подходит только для некоторых особых сценариев, когда вы боретесь с большими объемами данных.

Но что именно здесь происходит? Давайте посмотрим: если вы запустите сконфигурированный пример в цикле и вставите 12.635 объектов Employee, на моем компьютере это займет примерно 13 минут. Это происходит, если вы запускаете Coherence в синхронном режиме. Но вы можете использовать функцию, называемую «обратная запись», чтобы улучшить время отклика приложения, выполняя обновления базы данных асинхронно. Если вы добавите одну единственную строку в CacheServer coherence-cache-config.xml:

1
<write-delay>10s</write-delay>

необходимое время для выдачи вставок с точки зрения приложения сокращается до 9 секунд! Конечно, работающему серверу все еще нужно время для асинхронной обработки обновлений, но для клиента это оптимальное поведение.

Пока хватит. Я попытаюсь объяснить больше понятий, проходящих через примеры. Как вы уже догадались, есть много информации, если вы работаете с кешами. Следующая часть будет охватывать Coherence как кэш-память второго уровня для EclipseLink с GlassFish. Спасибо за чтение. Оставайтесь в курсе.

Справка: высокопроизводительный JPA со GlassFish и Coherence — часть 2 от нашего партнера по JCG Маркуса Эйзела в блоге «Разработка корпоративного программного обеспечения на Java»

Статьи по Теме :