Question

J'ai besoin d’idées pour mettre en œuvre un mécanisme de stockage / base de données en mémoire très performant en Java. Dans la plage de stockage de plus de 20 000 objets Java, mis à jour toutes les 5 secondes environ.
Certaines options auxquelles je suis ouvert:

Combinaison pure JDBC / base de données

JDO

Combinaison JPA / ORM / base de données

Une base de données d'objets

Autres mécanismes de stockage

Quelle est ma meilleure option? Quelles sont vos expériences?

EDIT: J'ai aussi besoin de pouvoir interroger ces objets

Était-ce utile?

La solution

Vous pouvez essayer quelque chose comme Prevayler (un cache en mémoire qui gère la sérialisation et la sauvegarde pour vous, les données persistent et sont sécurisées sur le plan des transactions). Il y a d'autres projets similaires. Je l'ai utilisé pour un grand projet, c'est sûr et extrêmement rapide.

S'il s'agit du même ensemble de 20 000 objets, ou du moins pas de 20 000 nouveaux objets toutes les 5 secondes mais de nombreuses modifications, il serait peut-être préférable de les mettre en cache et de les écrire périodiquement en mode de traitement par lots (les mises à jour jdbc batch sont beaucoup plus rapides mises à jour individuelles). Cela dépend si vous avez besoin que chaque écriture soit transposée de manière transactionnelle et si vous avez besoin d'un enregistrement des journaux des modifications ou simplement des modifications agrégées.

Modifier : comme d'autres publications l'ont mentionné, Prevayler, je pensais laisser une note à ce sujet: En gros, vous créez un objet pouvant faire l'objet d'une recherche / sérialisable (généralement un type de carte) qui est encapsulé dans une instance de Prevayler, qui est sérialisé sur le disque. Plutôt que de modifier directement votre carte, vous apportez des modifications en envoyant à votre instance Prevayler un enregistrement sérialisable de votre modification (uniquement un objet contenant l'instruction de modification). La version d'une transaction de Prevayler consiste à écrire vos modifications de sérialisation sur le disque afin de pouvoir, en cas d'échec, charger la dernière sauvegarde complète, puis rejouer les modifications. C'est sûr, bien que vous ayez assez de mémoire pour charger toutes vos données, et c'est une API assez ancienne, donc pas d'interface générique, malheureusement. Mais définitivement stable et fonctionne comme annoncé.

Autres conseils

Je recommande vivement H2 . C’est une sorte de " deuxième génération " version de HSQLDB réalisée par l’un des auteurs originaux. H2 nous permet de tester sur l'unité notre couche DAO sans nécessiter de base de données PostgreSQL, ce qui est génial .

Il existe un groupe réseau et une liste de diffusion actifs, et l'auteur Thomas Mueller est très sensible aux requêtes (hah, petit jeu de mots là-bas.)

Je ne sais pas si c'est l'option la plus rapide, mais je suis très satisfait de H2 chaque fois que je l'ai utilisé. Il a été écrit par la même personne que celle qui a initialement écrit Hypersonic (devenu plus tard HSQLDB).

Une autre option prétendument très rapide est Prevayler .

C’est une question un peu ancienne, mais de nos jours, de nombreuses bases de données ont un niveau de performances de 20 000 / s. La base de données à choisir dépend de la structure des données et du type de requêtes que vous souhaitez effectuer. Cela dépend aussi du volume global.

Nous avions un problème similaire avec un volume important de données de séries chronologiques, environ 300 000 rec / s, et nous avons fini par écrire une nouvelle base de données NFSdb. , avec une API assez simple et des performances décentes. Il peut faire environ 2 000 000 d'écriture d'objet / s et nous nous en sommes sortis sans ORM. L'API de stockage ressemble à quelque chose comme:

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();
}

Essayez ce qui suit, il fonctionne vraiment bien avec Hibernate et d'autres frameworks ORM

http://hsqldb.org/

Je voudrais essayer de OrientDB .

Chronicle Map est une base de données persistante en Java pure intégrable, fournissant un simple java Interface .util.Map . Il résiste à environ 1 million requêtes / mises à jour par seconde à partir d'un seul thread , à des performances de lecture / écriture cohérentes et évolue presque linéairement en fonction du nombre de cœurs de la machine.

Voici quelques recherches récentes sur les performances avec les chiffres réels:

La terre cuite pourrait également être une réponse pour vous. Il permet à plusieurs ordinateurs virtuels de partager des objets afin que vous puissiez répartir la charge, etc.

Vous pouvez également consulter db4o

.

Si vous souhaitez stocker toutes vos données en mémoire, consultez Prevayler .

Je ne l'ai jamais utilisé moi-même, mais cela semble être une bien meilleure solution que d'utiliser une base de données relationnelle pour les cas dans lesquels toutes vos données peuvent être stockées en mémoire.

Berkeley DB pour Java est une mémoire rapide base de données, extrêmement utile pour les graphes d'objets simples.

hsqldb est assez rapide, mais ce n’est pas ACID transaction-safe. La base de données java la plus rapide que je connaisse est db4o: tests d'évaluation .

Éditer : Veuillez noter que Prevayler n'est pas une base de données, voir http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase . Si vous n'avez plus de RAM, vous n'avez pas de chance.

H2 est vraiment fantastique, en effet, en mémoire, serveur normal et transactionnel, vous avez tout. Cependant, je vois que Db4o a été mentionné, ses performances sont bien meilleures avec Neodatis, et tout est bien configuré dans les référentiels Maven. Bien que pas très robuste, comme une Ferrari, rapide mais pas un camion comme Oracle.

Vous pouvez essayer CSQL (disponible dans les versions open source et entreprise). Il fournit une amélioration 30X des performances par rapport au disque. systèmes de base de données et fournit une interface JDBC. Il peut être configuré pour fonctionner en tant que base de données de mémoire principale autonome ou en tant que cache transparent pour les bases de données MySQL, Postgres, Oracle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top