Laboratório 4.4. Estatísticas de invocação de EJBs
5. Hibernate com JBoss AS
5.5. Habilitando o Cache de Segundo Nível
5.5.2. Usando o JBoss Cache com o Hibernate
O Hibernate suporta vários provedores de cache e já traz alguns na sua distri- buição padrão. Diferentes provedores de cache tem características diferentes em relação ao uso de memória, overhead de processamento e compatibilidade com ambientes clusterizados.
Os provedores inclusos no Hibernate oferecem apenas um conjunto de infor- mações básicas para gerenciamento, e o MBean de estatísticas do Hibernate fornece apenas contadores de acessos ao cache, mas não indicadores de tama- nho (consumo de memória).
Em comparação, o provedor de cache do JBoss AS fornece um MBean de mo- nitoração extremamente flexível, oferecendo vários indicadores de performan- ce extras e a capacidade de se visualizar ou modificar o conteúdo dos objetos no cache em tempo de execução.
elhor ainda, o provedor do JBoss AS, chamado JBoss Cache17 é clusteriza-
do e transacional, sendo inclusive recomendado como o preferencial pelos desenvolvedores do Hibernate para a maioria dos cenários envolvendo servidores de aplicações Java EE. O JBoss Cache é apenas uma biblioteca Java SE e portanto pode ser usado facilmente em outros servidores de aplicações que não o JBoss AS.
M
17 O nome original do projeto era TreeCache, mas já há alguns anos o projeto foi renomeado para JBoss Cache. JBoss AS Performance e Alta Disponibilidade – 2ª revisão Pag. 113
Para ter acesso ao MBean de monitoração do JBoss Cache, é necessário que o cache seja deployado como um serviço do servidor de aplicações, em vez de ser criado programaticamente pela aplicação, ou internamente pelo Hiberna- te. Então o MBean do serviço Hibernate terá que fazer referência e depender do Mbean do JBoss Cache.
A Listagem 5.6 ilustra uma configuração de Hibernate usando o JBoss Cache, onde o mesmo descritor de serviço do pacote SAR define os Mbeans do Hiber- nate e do JBoss Cache.
Em seguida, a Listagem 5.7 mostra um exemplo de modificação nas configu- rações de mapeamento das classes persistentes para habilitar elementos ca- cheados.
bserve que a configuração para cachear uma entidade ou relacionamento no Hibernate tem que ser modificada para compatibilizar com o JBoss Ca- che porque ele é um cache transacional, ao contrário dos provedores de cache fornecidos com o Hibernate.
O
Listagem 5.6 – Configurando o Hibernate para usar o JBoss Cache 1 <mbean code="org.jboss.hibernate.jmx.Hibernate" 2 name="hibernate:service=SessionFactory,name=Todo"> 3 4 <attribute name="SessionFactoryName"> 5 java:/hibernate/TodoSessionFactory 6 </attribute> 7 <attribute name="DatasourceName">java:/TarefasDS</attribute> 8 <attribute name="Dialect"> 9 org.hibernate.dialect.PostgreSQLDialect 10 </attribute> 11 <attribute name="ShowSqlEnabled">true</attribute> 12 <attribute name="StatGenerationEnabled">true</attribute> 13 <attribute name="SecondLevelCacheEnabled">true</attribute> 14 <attribute name="UseStructuredCacheEntriesEnabled">true</attribute> 15 16 <attribute name="CacheProviderClass"> 17 org.jboss.hibernate.cache.DeployedTreeCacheProvider 18 </attribute> 19 <attribute name="CacheRegionPrefix">Todo</attribute> 20 <depends optional-attribute-name="DeployedTreeCacheObjectName"> 21 hibernate:service=SecondLevelCache,name=Todo 22 </depends> 23
5.5. Habilitando o Cache de Segundo Nível 24 <depends>jboss:service=Naming</depends> 25 <depends>jboss.jca:service=LocalTxCM,name=TarefasDS</depends> 26 </mbean> 27 28 29 <mbean code="org.jboss.cache.TreeCache" 30 name="hibernate:service=SecondLevelCache,name=Todo"> 31 32 <attribute name="TransactionManagerLookupClass"> 33 org.jboss.cache.JBossTransactionManagerLookup</attribute> 34 <attribute name="IsolationLevel">REPEATABLE_READ</attribute> 35 <attribute name="CacheMode">LOCAL</attribute> 36 37 <attribute name="UseRegionBasedMarshalling">true</attribute> 38 <attribute name="InactiveOnStartup">false</attribute> 39 40 <attribute name="InitialStateRetrievalTimeout">17500</attribute> 41 <attribute name="SyncReplTimeout">17500</attribute> 42 <attribute name="LockAcquisitionTimeout">15000</attribute> 43 44 <attribute name="EvictionPolicyClass"> 45 org.jboss.cache.eviction.LRUPolicy</attribute> 46 <attribute name="EvictionPolicyConfig"> 47 <config> 48 <attribute name="wakeUpIntervalSeconds">5</attribute> 49 <region name="/_default_"> 50 <attribute name="maxNodes">5000</attribute> 51 <attribute name="timeToLiveSeconds">1000</attribute> 52 </region> 53 </config> 54 </attribute> 55 56 <depends>jboss:service=Naming</depends> 57 <depends>jboss:service=TransactionManager</depends> 58 </mbean>
Listagem 5.7 – Tornando uma classe cacheável pelo JBoss Cache 1 <class name="Tarefa" table="tarefa" lazy="false">
2 <cache usage="transactional" include="all" /> 3 ...
Já o detalhamento dos vários parâmetros de configuração do JBoss Cache e dos seus métodos para modificar o conteúdo armazenado estão além do esco- po deste curso. Mais informações podem ser obtidas na documentação do JBoss Cache em jboss.org e na documentação do Hibernate em hiber-
nate.org.
O curioso pode usar o método printDetails para obter uma listagem comple- ta e organizada (identada) do conteúdo do cache.
mesma instância / MBean do JBoss Cache pode ser compartilhada por vári- os SessionFactory do Hibernate, ou seja, várias aplicações diferentes po- dem usar o mesmo JBoss Cache. Isto é muito interessante para ambientes clusterizados. É possível mesmo assim configurar limites diferentes de espaço ocupado em memória e tempo de vida para cada aplicação e até configurar limi- tes diferentes para cada classe da mesma aplicação. Basta definir diferentes re- giões (<region>) internas ao cache.
A
5.6. Exercícios
Laboratório 5.1. Aplicação Hibernate estilo Java SE
(Prática Dirigida)
Objetivo: Reconhecer uma aplicação codificada erroneamente usando as con- figurações para o Java SE
O exemplo deste exercício é uma aplicação funcional, capaz de listar o conteú- do de uma lista de tarefas armazenada em um banco de dados PostgreSQL. O exemplo também fornece um script SQL para inicialização do banco, e o ins- trutor fornecerá instruções para inicializar uma instalação local do banco de dados.
Observe bem o código Java da aplicação, para comparar com os próximos exercícios, assim como as configurações de mapeamento e do Hibernate. Como este é um exemplo bem básico, deverá ser possível seu entendimento mesmo aos alunos que nunca lidaram antes com o Hibernate, ou para aqueles que não tem conhecimentos de programação Java.
Note que o buildfile deste exemplo fornece três alvos para a execução do cli- ente: lista, deleta e insere. Assim é possível modificar o banco de dados e observar os resultados interativamente, pela linha de comando.
O alvo insere cria três tarefas, com descrição pré-fixada. É possível executá- lo várias vezes e assim inserir várias “duplicadas” das três tarefas.
Já o alvo deleta esperam como argumento a chave primária da tarefa a ser deletada, passado como a System Property tarefa.id, ou seja, utilizando a opção -D da JVM na linha de comando do ant.
Não esqueça de instalar o driver JDBC do PostgreSQL no JBoss AS e acertar as configurações de conexão com o banco de dados. Saber realizar estas tare- fas é pré-requisito deste curso.