2009-06-10 8 views
16

J'ai souvent besoin d'une solution de persistance rapide (en termes de code), légère (en terme d'exécution, de dépendances) pour un tas d'objets, principalement entre les redémarrages d'applications.Quick'n'dirty persistence

Habituellement, j'ai recours à un hack de sérialisation Java, mais je me demande s'il y a quelque chose de mieux là-bas.

Avez-vous utilisé quelque chose de similaire?


Pour bien faire comprendre, une solution basée sur JPA est pas léger dans mon livre, et une base JDBC est pas rapide.


Mise à jour: Je faveur des cadres de configuration, moins sur celles qui nécessitent une configuration. Par exemple, la solution de sérialisation Java nécessite un implements Serializable et cela fonctionne. Une solution JPA, soit avec des annotations, soit avec des fichiers de mapping serait trop lourde.

Mise à jour 2: Juste pour être clair, je ne pense pas que la sérialisation soit un hack. C'est en fait un mécanisme très puissant, juste que je l'utilise d'une manière hackish en faisant de la persistance.

+0

+1 pour la question que je pourrais avoir besoin bientôt – KLE

Répondre

10

Je préfère XStream: Un seul pot nécessaire, rapide et très facile à utiliser

+0

Oui. XStream est très simple à utiliser. – Nat

+0

Intéressant- merci –

+0

+ intéressant en effet – KLE

5

Essayez iBatis. Je l'ai utilisé récemment sur un projet où je voulais une abstraction JDBC sans ORM/spring/container/etc.

Facile à installer, seulement quelques petits pots, et la config est très flexible. Cela ne vous donnera pas la flexibilité d'hibernate, et-change-the-db-at-a-moments-notice. Al. mais c'est assez léger.

+0

Sur la base de la mise à jour à la question que je dois dire aller avec XStream. –

3

Peut-être db4o travaillerait pour vous. Ne laissez pas le nom vous tromper, il peut être intégré. Selon its tutorial:

Object yourObject = ...; 

String fileName = ...; // where you wish to store the objects 
ObjectContainer container = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), fileName); 
try { 
    container.store(yourObject); 
} finally { 
    container.close(); 
} 
1

Vous recherchez

solution de persistance pour tout simplement un tas d'objets

Alors pourquoi Java build-sérialisation est un hack?

Si vous êtes paresseux peut-être sérialiser avec JSON vous aidera.

+0

La sérialisation n'est pas un hack. Ma façon de travailler avec ça est. Donc, je cherche comment les autres gérer ce genre de situation, tirer de leur expérience. –

+0

En ce qui concerne la sérialisation, vérifiez la sérialisation de JBoss qui présente plusieurs avantages techniques par rapport à l'implémentation de JDK. –

2

Vous devriez regarder JAXB. Il fait partie de Java depuis JRE 6. Il est assez facile à utiliser et vous permet de conduire le schéma XML à partir de votre modèle d'objet Java. La meilleure partie est que vous n'avez pas besoin de fichiers jar ou de bibliothèques supplémentaires car cela fait partie de Java. Découvrez le package javax.xml.bin.

Information sur le projet lui-même JAXB: https://jaxb.dev.java.net

Lien vers les JavaDocs dans le JRE: http://java.sun.com/javase/6/docs/api/javax/xml/bind/package-frame.html

1

Prevayler sonne comme une bonne option pour vous.

C'est basé sur la sérialisation Java et c'est sacrément rapide.

Plus d'infos sur:

  • http://www.prevayler.org/
  • http://www.prevayler.org/wiki/
3

J'ajouterais Jackson (json) et JAXB (xml); en plus de Xstream qui a déjà été mentionné. Jackson fonctionne bien avec une seule mise en garde: si vous avez un stockage polymorphe étendu, la désérialisation peut être difficile. C'est là que Xstream fonctionne le mieux. Et je suis d'accord que la sérialisation Java n'est pas bonne pour persistance - il est bon pour transférer des objets sérialisés, mais la persistance a une dimension temporelle, et les classes changent au fil du temps; et c'est là que les problèmes commencent (je suis sûr que vous le savez, mais comme d'autres semblent être ahurissants pour savoir pourquoi la sérialisation en utilisant le péristyle est mauvais, je pense que je vais le mentionner). Il est également beaucoup plus facile de regarder des choses sérialisées en utilisant des formats textuels (json, xml) que binaires. Et enfin, si vous avez besoin d'espace, la compression (comme gzip) fait des miracles, la taille des données après compression est identique, indépendamment du format (en supposant la même quantité d'informations)

+0

Oublié de mentionner: Jackson ne nécessite aucune configuration que ce soit dans la plupart des cas. Vous pouvez utiliser des annotations si vous le souhaitez, configurer etc; mais pour la plupart c'est zero-config semblable à comment fonctionne XStream. – StaxMan

1

Check out BeanKeeper - c'est le plus rapide, le plus sale et ORM/persistance plus facile que j'ai jamais vu. Certainement bat iBatis c'est sûr.

Store myStore = new Store((DataSource) ctx.lookup("jdbc/myds")); 

package com.acme.bookstore; 
public class Book 
{ 
    private String title; 
    private Author author; 

    ...setters, getters... 
} 

package com.acme.bookstore; 
public class Author 
{ 
    private String firstName; 
    private String lastName; 
    private Date birthDate; 

    ...setters, getters... 
} 

store.save(book); 
2
  1. Pour les collections d'objets essayer JDBM (un pot). Vous donne une carte qui est stockée sur le disque.

    DB db = new DBMaker(fileName).build();

    Map<String,MyObject> map = db.createTreeMap("mapName")

    map.put("obj1", myObject1);

  2. Pour config JAXB est vraiment simple et n'a pas de dépendances. Magasins en XML.

    JAXB.marshall(myObject, new File("config.xml")); // saved. that's it