Pergunta

Eu tenho uma fonte aberta aplicativo Java que usa Hibernate e HSQLDB para persistência. Em todos os testes o meu brinquedo, as coisas correr rápido e tudo é bom. Eu tenho um cliente que tem vindo a executar o software por vários meses continuamente e seu banco de dados tem crescido significativamente ao longo desse tempo, eo desempenho caiu gradualmente. Ele finalmente me ocorreu que o banco de dados poderia ser o problema. Tanto quanto eu posso dizer de declarações de registro, todos da computação no servidor acontece rapidamente, então isso é consistente com a hipótese de que a DB pode estar em falta.

Eu sei como fazer profiling normal de um programa para descobrir onde os pontos quentes são eo que está a ocupar uma quantidade significativa de tempo. Mas todos os profilers Sei do tempo de execução do monitor dentro do programa e não lhe dar qualquer ajuda sobre as chamadas para recursos externos. Quais as ferramentas que as pessoas usam ao perfil programas que estão usando chamadas db externos para descobrir onde a optimizar o desempenho?

Um pouco cego pesquisando em torno já encontrou alguns pontos quentes - Notei uma chamada onde eu estava enumerar todos os objetos de uma determinada classe, a fim de descobrir se havia algum. Uma mudança de uma linha com o critério [.setMaxResults (1)] que mudou chamada a partir de um meio segundo para virtualmente instantânea. Vejo também lugares onde eu fazer a mesma pergunta do db muitas vezes dentro de uma única transação. Eu ainda não descobri como armazenar em cache a resposta ainda, mas o que eu realmente quero é uma ferramenta para me ajudar a olhar para estes tipos de coisas de forma mais sistemática.

Foi útil?

Solução

Infelizmente, tanto quanto eu sei, não há nenhuma ferramenta para isso.

Mas há algumas coisas que você pode querer verificar:

  • Você está usando o carregamento ansioso em vez de carregamento lento? Pela descrição do seu problema, ele realmente parece que você não está usando o carregamento lento ...
  • Você ligado e configurado corretamente seu cache de segundo nível? Incluindo o cache de consultas? Hibernate cache mecanismo é extremamente poderoso e flexível.
  • Você considerar o uso de Hibernate Search? Dependendo da sua consulta, o índice de texto Hibernate Search completa em cima do Apache Lucene pode acelerar você consulta (sistema uma vez que a indexação é tão poderoso)

Outras dicas

Como a quantidade de dados que você está armazenando em HSQLDB? Eu não acho que ele tem um bom desempenho na gestão de grandes conjuntos de dados, uma vez que é apenas armazenar tudo em arquivos ...

Era uma vez uma ferramenta chamada IronGrid / IronEye / IronTrackSql que fez exatamente o que você está procurando. Infelizmente, eles saíram do negócio. Eles fizeram open source seu produto no último minuto, mas eu não tenho sido capaz de encontrar fonte ou um binário por algum tempo.

Eu tenho usado YourKit para perfilar recentemente, em parte porque você pode tê-lo perfil temporal SQL para encontrar seus mais chamados declarações e mais longas declarações em execução. Não é tão detalhado quanto IronGrid era, mas dá-lhe informações valiosas. Na minha última sessão de ajuste de banco de dados / hibernação, o problema acabou por ser o Hibernate e como e quando ele estava fazendo vs. carregamento lento ansioso, e adicionando algumas substituições judiciosas do padrão ao selecionar um grande número de itens.

Lotes para relatar aqui. Eu tenho alguns resultados, e ainda estou à procura de boas respostas.

Eu encontrei um par de ferramentas que ajuda:

VisualVM (com BTrace , ou o construído em Trace) pretende ajudar com o rastreamento, mas eu não tenho sido capaz de encontrar qualquer ferramenta que mostra tempo em chamadas de método.

YourKit tem a fama de ser útil; Pedi uma licença de código aberto.

A coisa mais útil que eu encontrei é Hibernate é construído em estatísticas. Se você definir hibernate.generate_statistics true em suas propriedades, você pode enviar sessionFactory.getStatistics(), e estatísticas detalhadas sobre o que os objetos foram armazenados e recuperados eo que afeta os caches estão tendo. Eu encontrei uma das respostas que eu queria no qeuryStatistics, que relatórios para cada consulta compilada, os acessos ao cache e erros, o número de vezes que a consulta foi executada, quantas linhas foram devolvidas, e os tempos de execução média, máximo e mínimo. Estes horários deixou bem claro que o tempo ia.

Então eu fiz alguma leitura em cache. A sugestão de Razenha foi à direita. [Vou marcar sua resposta como correta para agora.] Eu adicionei hibernate.cache.use_query_cache true aos meus propriedades e query.setCacheable(true); adicionado a maioria das minhas consultas. Eu também acrescentou <cache usage="read-write"/> para alguns dos meus arquivos .hbm.xml. Agora, a maioria das minhas estatísticas estão mostrando uma grande predominância de acessos ao cache, eo desempenho é muito melhor.

Eu ainda gosto de algumas ferramentas para me ajudar a traçar tempo de execução para que eu possa atacar os piores problemas, em vez do mais óbvio, mas esta é uma grande ajuda. Talvez uma das ferramentas de rastreamento acima venham a ajuda.

No Terracotta 3.1, você pode monitorar todas essas estatísticas em tempo real usando o Terracotta desenvolvedor Console. Você pode ver gráficos históricos para estatísticas de cache e ver as estatísticas de hibernação ou estatísticas de cache cluster de largura ou em uma base por nó.

Terracotta é open source. Mais detalhes e download está em Terracotta por Hibernate .

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