2016-07-22 4 views
1

Я разрабатываю приложение в Java EE, я хотел бы реализовать кеш, используя EJB @Singleton. Это кэширует референсные данные, поэтому мне нужно только один раз извлечь из БД, а затем сохранить его в памяти.Java EE @Singleton EJB для кэша

Я хотел бы знать с точки зрения реализации, если это правильно, используя @Singleton EJB? или вы могли бы порекомендовать мне другой подход? а также, если это правильно с точки зрения ООП?

И @Singleton EJB предназначен только для чтения, есть ли проблемы параллелизма, с которыми я мог столкнуться?

С уважением,

+1

Выполнено все время в приложениях J2EE и рекомендуется для чтения данных. Только уловка, если Db изменяется, то либо вам нужно как-то перезагрузить, либо отразится при перезагрузке приложения. –

+0

Поскольку вы можете перезагружать, обновлять, обновлять наблюдателем, это не уловка. http://docs.oracle.com/javaee/6/tutorial/doc/gkhic.html – keni

ответ

0

подход хорошо, но недостатком является то, что это не просто улучшить решение позже - не приятный интерфейс. Но возможно с каждым сервером JavaEE без каких-либо усилий по перенастройке, поскольку это стандартный JavaEE.

Другое решение немного зависит от используемого вами сервера.

WildFly (community): вы можете использовать внутреннюю подсистему infinispan и использовать ее в режиме HashMap. Вы можете просто использовать его локально для начала и изменить конфигурацию на кластеризованное (реплицированное или распределенное), если кеш растет, и вам нужно больше памяти для его кеширования.

JBoss EAP (Enterprise Product): здесь вы не можете использовать подсистему Infinispan, техническую можно, но она не поддерживается. Вам нужно использовать дополнительный JBossDataGrid (JDG), который основан на бесконечности. Здесь у вас есть дополнительные параметры, такие же, как и выше, для использования кеша в одном JVM-локальном или dist/repl. Или в другом экземпляре с удаленным доступом к кешу - часто достаточно быстро, но у вас есть один удаленный доступ, но JVM полностью отделен от сервера и может быть запущен другим. Кроме того, сервер и кеш не влияли на память друг друга.

Для других поставщиков вы также можете использовать подход JDG (или Infinispan как OpenSource).

0

В качестве быстрого и простого решения Singleton EJB может помочь, особенно если каталоги, значения которых не меняются.
Просто рассмотрим ваш EJB Singleton установить следующее:

  • Concurrency Управление по Container
  • Все методы создания LockType.READ одновременный доступ любым произвольным числом клиентов

Например:

import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.ejb.ConcurrencyManagement; 
import javax.ejb.ConcurrencyManagementType; 
import javax.ejb.Lock; 
import javax.ejb.LockType; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
public class InitializationBean { 

    @PostConstruct 
    public void initialize() { 
     // load data 
    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog01() { 
     return null; 

    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog02() { 
     return null; 

    } 
} 
Смежные вопросы