Pergunta

Estou usando o JBoss 5.1.0 GA juntamente com o Hibernate e agora estou tentando ativar o cache do segundo nível. Adicionei as seguintes propriedades à minha configuração de hibernação.

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

E anotei entidades que espero mudar com pouca frequência com o seguinte:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

Isso se baseia na minha compreensão do documentação.

O aplicativo implanta com sucesso sem mensagens de aparência assustadora (por exemplo, mensagens de aviso ou erro no fluxo de log). Por um curto período de tempo, vejo o armazenamento em cache trabalhando (estou usando as estatísticas do Hibernate para ver isso), mas depois de um curto período de tempo recebo traços de pilha do formulário (mesmo quando conectado como um único usuário sem acesso remoto):

"A transação tentou criar um novo myclass. Ele já foi criado desde que essa transação começou, por outra transação (possivelmente remota). Temos um evento de criação concomitante"

Seguindo por um rastreamento de pilha gigante que eventualmente remonta a uma consulta nomeada que fiz, que tem o seguinte formulário:

SELECT x FROM X WHERE x.deleted = false

A consulta nomeada não possui anotações adicionais para armazenamento em cache.

Qualquer conselho sobre como resolver esse problema seria muito apreciado.

Foi útil?

Solução

Algumas perguntas primeiro:

  1. Esta exceção é propagada ao seu aplicativo? Quero dizer, você é afetado por isso ou está apenas preocupado com a mensagem no log?
  2. Todas as suas entidades estão anotadas com estratégia transacional, ou apenas algumas delas?
  3. Sua consulta recupera objetos ansiosamente buscada de outra classe?

Eu diria que a melhor coisa que você poderia fazer agora é ativar a depuração (ou talvez até rastrear) o registro das operações de cache: log4j.logger.org.hibernate.cache=debug Isso lhe dirá exatamente o que o Hibernate está fazendo. EU suspeito que o Hibernate está tentando colocar um objeto no cache e fazê -lo novamente uma vez que vê o mesmo objeto durante a mesma sessão (talvez como parte da árvore de outro objeto). Havia um problema de carimbo de data / hora para o cache de consultas há algum tempo, e o mesmo problema poderia estar ocorrendo aqui. Por exemplo:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

Mas, novamente, é um pouco difícil prever qual é a solução sem saber qual seria o problema. E receio que apenas o log de Hibernate possa dizer qual é o problema.

PS: Isso deveria ser postado como um comentário, mas isso foi muito tempo para isso.

Outras dicas

Você já experimentou CachecoCurrencystrategy.nonstric_read_write? Eu li os documentos muitas vezes e não sei exatamente o que escolher, mas parece funcionar bem para meus projetos. Eu acho que o CacheCoCurrencyStrategy.Transactional é muito seguro e evite o desempenho do cache em determinadas circunstâncias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top