Pergunta

Eu preciso ideias para implementar um (realmente) de alto desempenho de banco de dados in-memory Mecanismo / Armazenamento em Java. Na faixa de armazenar mais de 20.000 objetos java, atualizado a cada 5 ou mais segundos.
Algumas opções Estou aberto a:

Pure JDBC / combinação de banco de dados

JDO

JPA / ORM / combinação de banco de dados

Um banco de dados de objetos

Outros mecanismos de armazenamento

O que é a minha melhor opção? Quais são suas experiências?

EDIT: Eu também preciso gostaria de ser capaz de consultar esses objetos

Foi útil?

Solução

Você poderia tentar algo como Prevayler (basicamente um cache que alças de serialização e de backup na memória para você, para persistir dados e é transacional seguro). Existem outros projetos semelhantes. Eu usei-o para um grande projeto, é seguro e extremamente rápido.

Se for o mesmo conjunto de 20.000 objetos, ou pelo menos não de 20.000 novos objetos a cada 5 segundos, mas muitas mudanças, você pode ser melhor fora cacheing as alterações e escrever periodicamente as mudanças no modo de lote (atualizações em lote JDBC são muito mais rápidos depois atualiza a linha individuais). Depende se você precisa de cada gravação para ser transactionally embrulhado, e se você vai precisar de um registro dos logs de alterações ou apenas mudanças agregadas.

Editar : como outras Amarrar mencionados Prevayler eu pensei em deixar uma nota sobre o que ele faz: Basicamente você cria um objeto pesquisável / serializável (tipicamente um mapa de algum tipo), que é envolto em uma instância Prevayler, que é serializado para o disco. Ao invés de fazer alterações diretamente no seu mapa, você faz mudanças, enviando sua instância Prevayler um registro serializável de sua mudança (apenas um objeto que contém a instrução mudança). A versão de Prevayler de uma transação é escrever as alterações de serialização para o disco de modo que em caso de falha que ele pode carregar o último backup completo e, em seguida, voltar a reproduzir a mudanças contra isso. É seguro, embora você tem que ter memória suficiente para carregar todos os seus dados, e é uma API bastante antigo, as interfaces de forma que nenhum genéricos, infelizmente. Mas definitivamente estável e funciona como anunciado.

Outras dicas

Eu recomendo H2 . Esta é uma espécie de versão "segunda geração" de HSQLDB feito por um dos autores originais. H2 permite-nos unidade-teste a nossa camada DAO sem a necessidade de um banco de dados PostgreSQL real, que é incrível .

Há uma lista de grupos e discussão líquida ativa, e autor Thomas Mueller é muito sensível às consultas (hah, chalaça pequena lá.)

Eu não sei se é a opção mais rápida, mas eu tenho sido muito satisfeito com H2 sempre que eu usei-o. Está escrito pela mesma pessoa que originalmente escreveu Hypersonic (que mais tarde se tornou HSQLDB).

Outra opção que é supostamente muito rápido é Prevayler .

É um pouco de uma questão antiga, mas hoje em dia há uma série de bancos de dados que têm um nível de desempenho de 20.000 / s. Qual banco de dados para escolher depende da estrutura de dados e tipo de perguntas que você gostaria de estar fazendo. Ele também depende do volume total.

Nós teve problema semelhante com grande volume de dados de séries temporais, cerca de 300.000 / rec s e acabamos escrevendo um novo banco de dados NFSdb , com API bastante simples e desempenho decente. Ele pode fazer cerca de 2.000.000 escreve objeto / s e fizemos embora sem ORM. API de armazenamento é algo como:

JournalFactory factory = new JournalFactory("/mnt1/data/tick");

MyObject o = new MyObject();
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) {

   o.setBlah(...);
   writer.append(o);

   // more appends here
   //
   writer.commit();
}

Tente o seguinte, ele executa muito bem com Hibernate e outros frameworks ORM

http://hsqldb.org/

Eu daria uma tentativa para OrientDB .

Chronicle Mapa é um puro banco de dados persistente Java embutido, fornecendo uma interface java.util.Map simples. Ele resiste a cerca de 1 milhão consultas / atualizações por segundo a partir de um único segmento , consistente de leitura / desempenho de gravação e escalas quase linearmente com o número de núcleos na máquina.

Aqui estão algumas pesquisas desempenho recente com números reais:

Terracotta também pode ser uma resposta para você. Ele permite que várias máquinas virtuais a objetos de acções para que possa distribuir a carga etc ...

Você também pode verificar db4o

Se você deseja armazenar todos os seus dados na memória, você pode querer olhar em Prevayler .

Eu nunca usei-me, mas parece que uma solução muito melhor do que usar um banco de dados relacional para aqueles casos em que todos os seus dados podem ser armazenados na memória.

Berkeley DB para Java é um rápido na memória banco de dados, extremamente útil para gráficos de objetos simples.

hsqldb é bastante rápido, mas não é ACID transação-safe. O mais rápido java-banco de dados que eu sei é db4o:. benchmarks

Editar : aviso favor que Prevayler não é um banco de dados, consulte http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase . Se você estiver fora de RAM, você está sem sorte.

H2 é verdadeiramente fantástico, na verdade, na memória, servidor normal e transacional, você tem tudo. No entanto, não comparar o desempenho dos bancos de dados de objetos, vejo DB4O mencionado, tive um desempenho muito melhor com Neodatis na verdade, e tudo bem configurar em repositórios Maven. Apesar de não ser muito robusto, como uma Ferrari, rápido, mas não um caminhão como Oracle.

Você pode tentar CSQL (disponível sob código aberto e versão empresarial) Ele fornece melhoria de desempenho 30X mais rígido com base sistemas de base de dados e fornece uma interface JDBC. Ele pode ser configurado para funcionar como stand de banco de dados de memória sozinho principal ou como um cache transparente para MySQL, Postgres, bancos de dados Oracle.

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