BACK

feedback / send your comments
mail to luc peuvrier
chat channel
joafip users mailing list
forums

In English

Fonctionalité d'auto sauvegarde

Cette fonctionnalité est une amélioration majeure de la future version 4.0.0

l'auto save n'est utilisable qu'au travers d'une session exclusive d'accès au données (voir aussi signification de sauvegarde)

La fonctionalité auto save permet d'éviter d'inserer dans le code l'appel de save() pour libérer la mémoire.

La sauvegarde est automatiquement faite que le nombre d'objets en mémoire atteint un certain seuil.

Fonctionalités addtionnelles:

Explication par l'exemple:
1) problème de "out of memory"
2) sauvegarde en session (comment éviter les "out of memory" en ajoutant des appels à save)
3) auto save (comment simplifier le code pour éviter les "out of memory")
4) instance dechargeable (economiser la mémoire utilisé pour de nouvelles instances)

1) Problème de "Out of memory"

Ci-après un "out of memory" peut se produire

final FilePersistenceBuilder builder = new FilePersistenceBuilder();
...
builder.set....
...
FilePersistence
filePersistence=builder.build();
IExclusiveDataAccessSession session= filePersistence.createExclusiveDataAccessSession();
session.open();
List<Integer> bigList=new PLinkedList<Integer>(); // bigList instance is in memory
for(int count=0;count<max;count++) {
    final int value=aValue(count);
    bigList.add(value); // this make bigList growing in memory
}
session.setObject("myBigList",bigList);
bigList=null; // no more reference the big list
session.save(); // after this the garbage collector can free memory of the big list
bigList=(
List<Integer>)session.getObject("myBigList"); // witchery of lazy load :
                                                       // all the big list is not loaded in memory
for(int value:bigList) {
// iteration make bigList growing in memory
    doSomething(value);
}

2) sauvegarde en session

Ci-dessous pour eviter un "out of memory", mais sauvegarder à chaque accés a l'objet peut être long

final FilePersistenceBuilder builder = new FilePersistenceBuilder();
...
builder.set....
...
FilePersistence
filePersistence=builder.build();
IExclusiveDataAccessSession session= filePersistence.createExclusiveDataAccessSession();
session.open();
session.setObject("myBigList",new PLinkedList<Integer>());
session.save();
List<Integer> bigList=(List<Integer>)session.getObject("myBigList"); //obtains a persisted big list
                                                                     //a proxy in unloaded state

for(int count=0;count<max;count++) {
    final int value=aValue(count);
    bigList.add(value); // grow in memory but only of the number of added objects
    session.save(); // save one by one will take a long time. only added element are writed
}
for(int value:bigList) {
    doSomething(value);
    session.save();
// save one by one will take a long time
}

3) auto save

Définir une seuil d'objet en mémoire accélère le programme en évitant la sauvegarde un à un.

final FilePersistenceBuilder builder = new FilePersistenceBuilder();
...
builder.set....
...
FilePersistence
filePersistence=builder.build();

filePersistence.autoSaveSetup(100); // set maximum persistetd objects in memory threshold to 100 objets
filePersistence.setAutoSaveEnabled(true); // enable auto save, will be done according to previous setup
filePersistence.setAutoSaveEnabled(this); // if want to control and/or listen saving
filePersistence.maintainInMemorySetup(50); // set maximum of persisted objets maintains
                                           //in memory after a save
filePersistence.setMaintainedInMemoryEnabled(true); // enable maintenance of persisted objects in memory
IExclusiveDataAccessSession session= filePersistence.createExclusiveDataAccessSession();
session.open();
session.setObject("myBigList",new PLinkedList<Integer>());
session.save(); //force save
List<Integer> bigList=(List<Integer>)session.getObject("myBigList"); //obtains a persisted big list
                                                                     //a proxy in unloaded state

for(int count=0;count<max;count++) {
    final int value=aValue(count);
    bigList.add(value); // grow in memory but only of the number of added objects up to "in memory threshold"
    // session.save(); no more needed
}
for(int value:bigList) {
    doSomething(value);
    // session.save(); no more needed
}

4) instance déchargeable

Il est possible de créer un nouvel objet sous forme de proxy qui pourra être sauvegardé et déchargé avant d'être attaché à l'objet persistant racine.
Cela ce faot comme suit::
IInstanceFactory instanceFactory = session.getInstanceFactory();
List<Integer> bigList=(List<Integer>)PLinkedList.newInstance(instanceFactory);

4.1) exemple avec PLinkedList

final FilePersistenceBuilder builder = new FilePersistenceBuilder();
...
builder.set....
...
FilePersistence
filePersistence=builder.build();

filePersistence.autoSaveSetup(100); // set maximum persistetd objects in memory threshold to 100 objets
filePersistence.setAutoSaveEnabled(true); // enable auto save, will be done according to previous setup
filePersistence.setAutoSaveEnabled(this); // if want to control and/or listen saving
filePersistence.maintainInMemorySetup(50); // set maximum of persisted objets maintains
                                           //in memory after a save
filePersistence.setMaintainedInMemoryEnabled(true); // enable maintenance of persisted objects in memory
IExclusiveDataAccessSession session= filePersistence.createExclusiveDataAccessSession();
session.open();
IInstanceFactory instanceFactory = session.getInstanceFactory();
List<Integer> bigList=(List<Integer>)PLinkedList.newInstance(instanceFactory); // this list can be unloaded

for(int count=0;count<max;count++) {
    final int value=aValue(count);
    bigList.add(value); // grow in memory but only of the number of added objects up to "in memory threshold"
    // session.save(); no more needed
}
session.setObject("myBigList",bigList);//add to allow retrieval
session.save(); //force save
for(int value:bigList) {
    doSomething(value);
    // session.save(); no more needed
}

4.2) ajouter une "proxy factory" à votre POJO

public class MyPojo {

  // keep a reference to instance factory, null if not used
  private final IInstanceFactory instanceFactory;

  public MyPojo() {
    this(null);
  }

  public MyPojo(final IInstanceFactory instanceFactory) {
    super();
    this.instanceFactory=instanceFactory;
  }

  // factory method
  public static MyPojo newInstance(final IInstanceFactory instanceFactory) {
    final MyPojo newInstance;
    if( instanceFactory==null)  {
      newInstance=new MyPojo();
    } else {
      newInstance=(MyPojo)instanceFactory.newInstance(MyPojo.class,new CLass[]{IInstanceFactory.class},
         new Object[]{instanceFactory});
    }
    return newInstance;
  }

  public XXX asXXX() {
    // below replace "new XXX(this);"
    return XXX.newInstance(instanceFactory,this);
  }
}



feedback / send your comments
mail to luc peuvrier
chat channel
joafip users mailing list
forums

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 Unported License.
© 2007-2012, joafip