quinta-feira, 6 de dezembro de 2007

Problemas com Hibernate e MySQL

Ontem, estava ajudando um amigo com um problema que estava acontecendo num sistema que ele estava desenvolvendo. O escopo era o seguinte:

Um software de controle Web, utilizando o banco de dados MySQL 5, utilizando Hibernate. Outro pequeno software que fica rodando no servidor, como um daemon, executando algumas tarefas, e caso aconteça um erro ele insere um registro em uma certa tabela, no mesmo banco MySQL que o sistema Web utiliza.

Até ai tudo bem. O que acontecia é que, o software daemon inseria coisas no banco, porém o software Web, não conseguia enxergar estes novos dados inseridos. Começamos a quebrar a cabeça pensando que era problema no hibernate, mudamos toda a parte de cache, desabilitamos o cache L2 do hibernate, tiramos o cache daquela consulta, tiramos o cache total da session, e nada. E realmente não podia ser aquilo, porque o mesmo esquema de configuração usado lá é o mesmo esquema usado em outros softwares que estamos desenvolvendo.

Então, após muita busca, encontramos a seguinte documentação:
http://mysql2.mirrors-r-us.net/doc/refman/5.0/en/innodb-transaction-isolation.html

O problema que ocorria era justamente no MySQL, pois ele por padrão usa um modo de cache interno para otimização de desempenho, que realmente não é muito interessante. E quando a aplicação Daemon comitava o registro, a aplicação web não via aquele registro, por causa do cache do MySQL.

A solução foi então aplicar a configuração referida no link acima, que é:

  1. Baixar o MySQL
  2. Editar o arquivo [dir-install-mysql]/my.ini
  3. Procure a linha [mysqld]
  4. adicione o seguinte, logo abaixo:
    transaction-isolation=READ-COMMITTED
  5. Startar o MySQL
Isso fará com que o MySQL atualize o seu cache, com os dados gravados por outras aplicações ou conexões/sessões.

obs: Tem uns comentários interessantes, no final da página do mysql.

Espero que isso ajude alguém!

Valeu.

Nenhum comentário: