Общий подход
Вы можете использовать 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 localhostSystem.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Start CacheServerDefaultCacheServer.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 localhostSystem.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Disable local storage--need to start independent CacheServerSystem.setProperty("tangosol.coherence.distributed.localstorage", "false");// Get the configured Cache NamedCache cache = CacheFactory.getCache("Employee");//Create a new EmployeeEmployee emp = new Employee();emp.setFirstName("Markus");emp.setLastName("Eisele"); emp.setId(1);//Put the Employee into the cachecache.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»
- Высокопроизводительный JPA с GlassFish и Coherence — Часть 1
- Высокопроизводительный JPA с GlassFish и Coherence — Часть 3
- Разработка и тестирование в облаке
- Управление конфигурацией в Java EE
- Утечка: Oracle WebLogic Server 12g
- Декораторы Java EE6: декорирование классов во время внедрения
- Список учебных пособий по Java и Android
