2010-08-09 23 views
15

Mes tests d'intégration s'exécuteraient beaucoup plus rapidement si j'utilisais la base de données en mémoire au lieu de PostgreSQL. J'utilise JPA (Hibernate) et j'ai besoin d'une base de données en mémoire qui serait facile à utiliser en utilisant JPA, facile à installer et fiable. Il doit supporter JPA et Hibernate (ou vice versa si vous voulez) assez largement puisque je n'ai aucun désir d'adopter mon code d'accès aux données pour les tests.Simple et fiable dans la base de données de mémoire pour les tests d'intégration java rapide avec le support de JPA

Quelle base de données est le meilleur choix compte tenu des exigences ci-dessus?

Répondre

19

Pour tests d'intégration, j'utilise maintenant H2 (de l'auteur original de HSQLDB) que je préfère HSQLDB. C'est faster (et je veux que mes tests soient aussi rapides que possible), il a quelques fonctionnalités intéressantes comme le mode compatibility, l'équipe de développement est très réactive (alors que HSQLDB est resté en sommeil pendant des années jusqu'à très récemment).

+0

Les repères sont pour le stockage de données persistant, les résultats en mémoire peuvent être différents car la plus grande partie de l'overhead est due aux politiques de disque/cache dans les bases de données. La différence entre H2 et HSQLDB est considérable mais pas critique. Je choisirais toujours en fonction de la facilité d'utilisation, de la configuration minimale et des fonctionnalités. Et la fonction de mode de compatibilité semble en effet très attrayante. Merci! – topchef

+0

@grigory: Oui, vous avez raison. Mais même en utilisant un mode persistant, H2 et HSQLDB s'exécutent en mémoire par défaut et reportent l'écriture sur le disque (au prix de la Durabilité). Donc les données sont toujours intéressantes. –

4

J'ai utilisé HSQLDBin-memory pour les tests d'intégration de la persistance JPA/Hibernate en Java. Démarre assez rapidement, ne nécessite aucune configuration spéciale. Le seul problème que j'ai vu jusqu'ici avec l'utilisation de HSQLDB avec Hibernate était de faire avec la taille de lot devant être définie sur 0, mais cela pouvait simplement être lié à une ancienne version. Je vais creuser et voir si je peux trouver les détails de ce problème.

Derby supports an in-memory mode ces jours-ci, il n'est plus marqué expérimental.

+0

support égal pour la base de données en mémoire Je voudrais avoir la solution la plus simple et la moins invasive (avec une personnalisation nulle (sauf pour persistence.xml)). Merci! – topchef

+0

Un autre vote pour HSQLDB, en particulier depuis la version de V2, v1.x ne supporterait pas certaines des constructions actuelles qui sont supportées par JDBC, comme le fait de retourner des valeurs de clé générées automatiquement, mais v2 le fait. – mezmo

2

J'utilise Derby. D'une part, il y a environ 3 lignes de code par test unitaire en moins, car il n'y a pas besoin d'un arrêt après le test. Cependant, vous devez utiliser une implémentation JPA qui peut supprimer et créer des tables telles qu'EclipseLink.

Derby peut également initialiser une nouvelle base de données en mémoire à partir d'un fichier afin que vous puissiez avoir une base de données de référence et y revenir à tout moment. Pour les tests unitaires cependant, je préfère créer mes objets dans la logique @Before de mon test unitaire. Je trouve cela plus facile surtout avec JPA car cela me permet de faire des refactorings et de ne pas m'inquiéter de la structure de base de données sous-jacente. Les outils tels que DBunit reposent sur une structure pratiquement statique et le refactoring implique de modifier manuellement les XML DBunit plutôt que de se fier aux capacités de refactoring d'Eclipse.