Gravando HTTP Sessions em Banco de Dados no JBoss AS 7.1.3 (JBoss EAP 6.0.1)

Postado em Atualizado em

infinispan_logo_600px

Olá amigos,

Ano passado trabalhei com um desenvolvedor que me perguntou o seguinte: É possível persistir as sessões HTTP em um banco de dados no JBoss 7?   Na época acabei nem verificando essa possibilidade mas realizando alguns testes e olhando a documentação percebi que é possível sim.

Esse artigo da própria comunidade explica o uso dessa abordagem: https://community.jboss.org/wiki/HAWebSessionsViaDatabasePersistence

Essa thread também é interessante: https://community.jboss.org/message/745489

Artigo Bacana: http://infinispan.blogspot.com.br/2012/05/how-to-configure-infinispan-with.html

Vamos para os nossos testes então!

O primeiro passo é adicionar um datasource apontando para o banco de dados que será utilizado.  Nos meus testes estou utilizando o MySQL :

<datasource jndi-name="java:/mysqlds" pool-name="mysql_pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
  <connection-url> jdbc:mysql://192.168.2.13:3306/jbossdb</connection-url>
  <driver>mysql-connector-java-5.1.22-bin.jar</driver>
  <security>
    <user-name>root</user-name>
    <password>jboss</password>
  </security>
</datasource>

Essa persistência só pode ser realizada nos profiles ha ou full-ha pois vamos utilizar o Infinispan.  Altere o cache web no subsystem Infinispan e deixe-o como abaixo:

<cache-container name="web" aliases="standard-session-cache" default-cache="database" module="org.jboss.as.clustering.web.infinispan">
  <transport lock-timeout="60000"/>
  <invalidation-cache name="database" mode="ASYNC" batching="true">
     <string-keyed-jdbc-store datasource="java:/mysqlds" passivation="false" purge="false" shared="true">
       <property name="databaseType">MYSQL</property>
       <string-keyed-table prefix="stringbased">
         <id-column name="id" type="VARCHAR(200)"/>
         <data-column name="datum" type="BIGINT"/>
         <timestamp-column name="version" type="TIMESTAMP"/>
       </string-keyed-table>
      </string-keyed-jdbc-store>
  </invalidation-cache>
</cache-container>

Edite o arquivo jboss-eap-6.0.1\jboss-eap-6.0\modules\org\infinispan\main\module.xml e adicione os módulos:

  • <module name=”org.infinispan.cachestore.remote”/>
  • <module name=”org.infinispan.client.hotrod”/>
  • <module name=”org.infinispan.cachestore.jdbc”/>

Veja:

<module xmlns="urn:jboss:module:1.1" name="org.infinispan">

  <properties>
     <property name="jboss.api" value="unsupported"/>
  </properties>

  <resources>
    <resource-root path="infinispan-core-5.1.8.Final-redhat-1.jar"/>
    <!-- Insert resources here -->
  </resources>

  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    <module name="net.jcip"/>
    <module name="org.jboss.jandex"/>
    <module name="org.jboss.logging"/>
    <module name="org.jboss.marshalling"/>
    <module name="org.jboss.marshalling.river"/>
    <module name="org.jgroups"/>
    <module name="org.infinispan.cachestore.remote"/>
    <module name="org.infinispan.client.hotrod"/>
    <module name="org.infinispan.cachestore.jdbc"/>
  </dependencies>
</module>

Perceba que o invalidation-cache está utilizando o datasource do MySQL.  As tabelas serão criadas ao ser deployada uma aplicação com a tag <distributable/>.

Inicie o JBoss:

  jboss-eap-6.0.1\jboss-eap-6.0\bin\standalone.bat -c standalone-ha.xml

Realize o deploy da aplicação e perceba que o serviço do Infinispan será iniciado:

  23:06:48,080 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 56) JBAS010281: Cache database inicializado a partir do recipiente web

E  a tabela criada no MySQL:

infinispan

Espero que tenha ajudado!

Abraços

10 comentários em “Gravando HTTP Sessions em Banco de Dados no JBoss AS 7.1.3 (JBoss EAP 6.0.1)

    Neylor Leandro de Sousa disse:
    1 de abril de 2013 às 8:37

    Mauricio, quando essa abordagem é interessante? Ao meu ver, o fato de utilizar a rede para criar e atualizar sessões no banco é mais custoso do que deixar em disco local.

      Mauricio Magnani Jr respondido:
      1 de abril de 2013 às 15:46

      E ai Neylor,

      Nunca utilizei em meus projetos mas realmente deve ser bem custoso…

      A utilidade dessa abordagem pode ser vista nessa frase:

      “The basic use case we hear for this is environments where sessions need to be available to AS instances located across a WAN. JBoss Cache(o JBoss Cache foi substituido pelo Infinispan)/JGroups clusters can span a WAN but often users find it impractical to configure their cluster(s) in that way. However, their IT infrastructure already supports making RDBMS data accessible across the WAN. So, persisting sessions to the DB makes them available across the WAN.”

      Acho que para isso serviria… mas nao consigo imaginar outra situação!

      Abs

        Neylor Leandro de Sousa disse:
        1 de abril de 2013 às 16:16

        Muito obrigado! Excelente a explicação!

        Mauricio Magnani Jr respondido:
        1 de abril de 2013 às 16:18

        Obrigado por acompanhar os posts rsrs
        É sempre bom ter alguém por aqui🙂

        Abs

      Renata disse:
      13 de setembro de 2013 às 16:04

      Olá,

      Bem, no meu atual cenário, essa abordagem pode ser interessante: tenho uma aplicação EAR, com vários módulos WAR empacotados, e estamos migrando o ambiente para JBoss 7. Uma das coisas que preciso fazer é compartilhar a sessão entre os módulos web (a aplicação é antiga, e várias informações são trocadas setando atributos na sessão).

      Até o momento, a outra opção que encontrei para este cenário foi essa: https://community.jboss.org/wiki/SharingHTTPSessionsWithInfinispan

    Rafael disse:
    18 de julho de 2013 às 11:07

    Amigo,

    ao fazer essa mesma configuração, porém com SQL_SERVER, ocorreu o seguinte erro:
    10:43:30,542 ERROR [org.infinispan.loaders.jdbc.TableManipulation] (MSC service thread 1-1) ISPN008011: Error while creating table; used DDL statement: ‘CREATE TABLE yk_session_//default-host//testsession(id VARCHAR(200) NOT NULL, datum BIGINT, version TIMESTAMP, PRIMARY KEY (id))’: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ‘/’.

    Não entendi exatamente o que pode ter causado esse erro. tem alguma ideia?

    parabéns pelo blog!

      Mauricio Magnani Jr respondido:
      18 de julho de 2013 às 11:12

      Oi Amigo,

      Acredito que os types estejam incorretos para o SQL Server… existe TIMESTAMP no SQL Server? Eu nao me recordo… talvez seja isso ai na hora de criar as tables acaba ocorrendo essa exception…

      Perceba que essa exception com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ‘/’. pode confirmar o que estou dizendo hehe

      Abraços e Obrigado!

    Rafael disse:
    19 de julho de 2013 às 16:08

    Mauricio,

    tem timestamp sim. acredito que o erro seja no momento que ele tenta apendar esse “//default-host//” no nome da tabela… de qualquer forma, resolveria se pudesse usar uma tabela já existente. sabe se isso é possível?

    Olhei na documentação do infinispan, e não achei.

    uma outra opção seria usar ele pra gravar as sessões no memcached. sabe se é possível?

    Abraço.

      Mauricio Magnani Jr respondido:
      21 de julho de 2013 às 16:59

      Oi Rafael,

      Desculpe a demora em responder…. então eu realmente nao encontrei nenhuma documentação sobre isso. Vou dar mais uma olhada por ai e e encontrar te aviso mas se conseguir resolver explicar ai para gente hehe!

      Abraços

    arquimedes disse:
    7 de janeiro de 2015 às 23:07

    Mauricio parabéns pelo blog cara sou seu fan se deixa fico aqui o dia todo

    andei lendo muita coisa mas não achei ainda nada que pode resolver meu problema
    tenho uma aplicação e queria descobri se existe um jeito em uma possível atualização a
    sessão do usuário não cair seja com cluster ou modo domain só queria uma ideia para seguir
    um caminho desde já agradeço e parabéns pelo excelente site.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s