BACK
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:
- Le nombre d'objets les plus accédés à maintenir en mémoire
peut
être définit. Cela permet d'éviter de décharger les objets les plus
accédés, economise le temps de rechargement à partir du fichier.
- Il est possiblle de créer de nouvelles instances qui
peuvent être
sauvegardées et déchargées avant d'être attachées au groupe des objets
persistés.
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);
}
}
This work is licensed under a Creative Commons Attribution 3.0 Unported License.
© 2007-2012, joafip