• Nenhum resultado encontrado

MBeans para o Hibernate

No documento Apostila JBoss Avancado Rev2 08122010 (páginas 108-111)

Laboratório 4.4. Estatísticas de invocação de EJBs

5. Hibernate com JBoss AS

5.4. MBeans para o Hibernate

O JBoss AS não apenas incorpora os JARs do Hibernate em sua distribuição padrão, de modo que eles não necessitam ser instalados pelo administrador nem incluídos nos pacotes WAR ou EAR de aplicações, mas também utiliza o Hibernate dentro da sua implementação do EJB 3.

crescentar JARs do Hibernate na aplicação ou sobreescrever os fornecidos com a sua instalação do JBoss AS pode prejudicar o funcionamento correto de aplicações deployadas.

A

Além de já incluir o Hibernate, o JBoss AS fornece recursos específicos de in- tegração com o framework, fornecendo ao administrador uma flexibilidade e visibilidade bem superiores às conseguidas com uma aplicação Hibernate pa- drão. A desvantagem é que, para usufruir dos recursos específicos da integra- ção Hibernate x JBoss AS, é necessário gerar um empacotamento não previsto pelo padrão Java EE, específico para o JBoss AS.

A idéia básica é tornar as configurações do Hibernate e o conjunto de objetos mapeados para o banco de dados em um serviço gerenciado pelo servidor de aplicações, o que no caso do JBoss AS corresponde a um Mbean.

É uma idéia tão boa que a comunidade Hibernate fornece sua versão própria deste MBean, que seria configurável em qualquer servidor de aplicações. Mas o MBean do Hibernate ainda não tem todos os recursos do MBean equivalente fornecido pelo JBoss AS, por isso iremos nos concentrar no segundo.

Todas as classes mapeadas (objetos persistentes), junto com suas respectivas configurações de mapeamento (arquivos *.hbm.xml), se não forem usadas anotações, são empacotaras em um arquivo SAR, que deve receber uma confi- guração de serviço (META-INF/jboss-service.xml) semelhante ao apresenta- do na Listagem 5.3.

Listagem 5.3 – Configuração do MBean Hibernate fornecido com o JBoss AS 1 <server> 2 3 <mbean code="org.jboss.hibernate.jmx.Hibernate" 4 name="hibernate:service=SessionFactory,name=Todo"> 5 6 <attribute name="SessionFactoryName"> 7 java:/hibernate/TodoSessionFactory 8 </attribute> 9 <attribute name="DatasourceName">java:/TarefasDS</attribute> 10 <attribute name="Dialect"> 11 org.hibernate.dialect.PostgreSQLDialect

5.4. MBeans para o Hibernate 12 </attribute> 13 <attribute name="ShowSqlEnabled">false</attribute> 14 15 <depends>jboss:service=Naming</depends> 16 <depends>jboss.jca:service=DataSourceBinding,name=TarefasDS</depend s> 17 </mbean> 18 19 </server>

O nome JMX do MBean é de escolha do administrador ou desenvolvedor, as- sim como o nome JNDI (SessionFactoryName) sob o qual será registrado o Session Factory do Hibernate para uso pela aplicação.

Este “serviço Hibernate” poderá ser compartilhado com componentes em vári- os pacotes WAR, EJB-JAR ou EAR, inclusive componentes de aplicações dife- rentes. O desenvolvedor e o administrador podem agora ver refletida direta- mente, nos pacotes da aplicação, a divisão em camadas de apresentação (WAR ), negócios (EJB-JAR) e persistência (SAR do Hibernate).

O serviço Hibernate para a incorporar as configurações de conexão a BD, ge- renciamento de transações e outras que antes estariam dentro do arquivo hi- bernate.cfg.xml. Com uma diferença: já que não estamos mais em um paco- te Java EE padrão, não existe o espaço de nomes local do JNDI para o aponta- mento do Datasource. Então é necessário referenciar o DataSource direta- mente no espaço de nomes global do JNDI.

Então as configurações do Hibernate e classes persistentes estão em um paco- te SAR. A ordenação padrão de deployent de pacotes do JBoss AS assegura que o seviço Hibernate será deployado antes dos componentes Servlet ou EJB que façam uso dele. Entretanto, deve ser configurada explicitamente uma de- pendência em relação ao MBean do Datasource, caso contrário o serviço Hi- bernate será deployado antes deste.

Também é possível aninhar o pacote SAR do serviço Hibernate dentro de um EAR, junto aos demais componentes da aplicação.

Além do inconveniente de se mudar o empacotamento da aplicação, é necessá- rio modificar o código da aplicação para obter o SessionFactory do Hiberna- te à partir de uma busca JNDI em vez de criá-lo diretamente à partir do objeto Configuration, que não está mais disponível para a aplicação.

Com todos esses inconvenientes (mudar o empacotamento, a sintaxe de confi- guração do Hibernate, e o código da aplicação) a integração com o JBoss deve ter alguma vantagem bastante forte em relação à configuração Java EE do Hi- bernate sem usar o serviço MBean.

As vantagens serão o assunto das duas próximas sessões deste capítulo. Por enquanto, vamos apenas dizer que as vantagens são tão grandes que o JPA do

EJB 3 incorpora a mesma idéia de tratar o ORM como um serviço gerenciado pelo servidor de aplicações, em vez de algo apenas interno às aplicações.

riginalmente, o JBoss AS definiu um novo tipo de pacote, o HAR, para confi- gurações do Hibernate e classes persistentes. Mas logo percebeu-se que este HAR era apenas um SAR com propósito específico e o HibernateDe-

ployer, que lidava com o pacote HAR, foi depreciado. Para compatibilidade retro-

ativa, o SARDeployer passou a aceitar arquivos *.har contendo descritores hi- bernate-service.xml, embora seu uso não seja mais recomendado.

O

5.4.1.

Monitorando e Modificando um SessionFactory

Dinamicamente

O MBean do serviço Hibernate pode ser acessado por qualquer console JMX à partir do nome escolhido pelo desenvolvedor ou administrador, e utilizado para inspecionar e até mesmo modificar as configurações do SessionFactory. Alguns atributos, como o JdbcBathSize, podem ser utilizados para tuning fino da aplicação (que está além do escopo deste curso). Outros, como ShowSQLEn- abled, serão bastante úteis para depuração de aplicações.

Qualquer mudança de configuração via JMX será perdida no reinício da aplica- ção, a não ser que o descritor de deployment do MBean também seja modifica- do.

uidado pois mudanças nas configurações do serviço Hibernate só terão efei- to para as aplicações usuários do serviço depois de chamado o método re-

buildSessionFactory do MBean.

C

5.4.2.

Geração de Estatísticas do Hibernate

O Hibernate pode ser configurado para gerar um conjunto abrangente de es- tatísticas de performance, muito úteis para a otimização do Mapeamento Ob- jeto-Relacional configurado para a aplicação e do próprio banco de dados. O problema é como extrair estas estatísticas de dentro do Hibernate. A “solu- ção padrão” envolve modificações na aplicação para gerar programaticamente o MBean de estatísticas e publicá-lo no MBean Sever da plataforma (JVM) ou do do servidor de aplicações.

Esta solução significa programar no código da aplicações coisas relacionadas com a infra-estrutura, e não com a lógica de negócios, e exige conhecimento de APIs (o JMX) que normalmente não são da alçada do desenvolvedor de sis- temas (papel application component provider do Java EE), e sim do desenvol- vedor de middleware (system component provider).

5.4. MBeans para o Hibernate

Em teoria seria possível gerar um arquivo de configuração para o MBean de estatísticas fornecido pelo Hibernate e então deploya-lo no JBoss como um “SAR degenerado”. A vantagem desta abordagem é que não exige modifica- ções na aplicação, Só que na prática esta abordagem não funciona, porque o MBean irá tentar acessar imediatamente o SessionFactory, que ainda não terá sido inicializado pela aplicação.

Explicando melhor: O SessionFactory é criado e publicado no JNDI com o de- ploy do serviço Hibernate. Entretanto este SessionFactory tem inicialização “preguiçosa”, que é postergada até o momento em que a aplicação efetiva- mente faça uso dele. Por causa disso, o MBean de estatísticas do Hibernate re- ceberá um erro ao tentar iniciar a geração de estatísicas, durante o seu pró- prio deployment, e irá falhar.

Pelo mesmo motivo, não adianta tornar o MBean de estatísticas dependente dos MBeans gerados pelo deployment dos componente da aplicação que faz uso do serviço Hiberante. O problema aqui não é de ordem de depeloyment, e sim de ordem de execução.

A boa notícia é que o próprio serviço Hibernate (na versão fornecida junto com o JBoss AS) é capaz de gerar o MBean de estatísticas no momento corre- to. A Listagem 5.4 ilustra como fazer isso.

Listagem 5.4 – Habilitando o Mbean de estatísticas do Hibernate 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">false</attribute> 12 <attribute name="StatGenerationEnabled">true</attribute>

Basta acrescentar o atributo StatGenerationEnabled com o valor true e o MBean de estatísticas será automaticamente gerado, recebendo o mesmo nome do MBean do SessionFactory, acrescido de type=stats.

Por exemplo, para o exemplo da listagem, o nome do MBean de estatísticas se- ria hibernate:service=SessionFactory,name=Todo,type=stats.

No documento Apostila JBoss Avancado Rev2 08122010 (páginas 108-111)