Общий подход
Вы можете использовать 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»
- Высокопроизводительный JPA с GlassFish и Coherence — Часть 1
- Высокопроизводительный JPA с GlassFish и Coherence — Часть 3
- Разработка и тестирование в облаке
- Управление конфигурацией в Java EE
- Утечка: Oracle WebLogic Server 12g
- Декораторы Java EE6: декорирование классов во время внедрения
- Список учебных пособий по Java и Android