Pergunta

Temos 2 aplicativos da Web Java são leitura/gravação e 3 aplicativos de leitura/gravação Java independentes (um carrega perguntas por e -mail, um processa um feed XML, um envia email para os assinantes) todos usam o Hibernate e compartilham uma base de código comum.

O problema que encontramos recentemente é que as perguntas carregadas por e -mail às vezes substituem perguntas criadas em um dos aplicativos da Web. Observe que essas são perguntas separadas que devem ter IDs separados. Originalmente, pensamos que isso era uma questão de armazenamento em cache. Tentamos desligar o cache do segundo nível, mas isso não faz diferença.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

Pergunta:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

Estamos usando o MySQL BTW.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Não estamos abrindo e fechando explicitamente sessões, mas sim que o Hibernate os gerencie via Util.getSessionFactory().getCurrentSession().

Preferimos não configurar um cache de 2º nível em cluster nesta fase, pois isso cria outra camada de complexidade e estamos mais do que felizes com o nível de desempenho que obtemos do aplicativo como um todo.

Então, a implementação de um padrão de sessão aberta nos aplicativos da Web e gerencia manualmente as sessões nos aplicativos independentes parece que isso faria isso?

Ou quaisquer outras sugestões/idéias, por favor?

Foi útil?

Solução 2

Acontece que esse problema não estava relacionado ao Hibernate.

Uma das tabelas de banco de dados no servidor de estadiamento foi preenchida com dados antigos que deveriam ter sido limpos. Inicialmente, isso deu a aparência de ID ser substituído, mas uma investigação mais aprofundada provou o contrário!

Depois que removemos os dados desonestos, tudo estava bem.

Outras dicas

Como todas as perguntas têm IDs, presumo que todas as perguntas sejam obtidas no seu banco de dados MySQL.

Supondo que você não precise armazenar as perguntas como objetos transparentes na memória, mas você seleciona todas as perguntas para cada vez que as apresenta, tenho uma sugestão simples.

Substitua o gerador de identificação por uma sequência no banco de dados. (Eventualmente, o ID como AutoNumber no MySQL). Em seguida, o banco de dados em vez dos aplicativos garante que todas as perguntas obtêm um ID exclusivo.

Esta solução é bastante simples e reduz sua complexidade. E só funciona se você persistir todas as perguntas recebidas das diferentes fontes no seu banco de dados e selecionar -as daqui.

Se esta solução fornecer problemas de desempenho, você deve investigar mais sobre como o seu gerador de identificação de hibernato funciona. O Hibernate fornece vários geradores diferentes para diferentes cenários.

Espero que isso ajude!

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