Lorsque votre méthode de requête renvoie un seul objet, il est facile de simplement fermer la requête avant de renvoyer l'objet unique. En revanche, lorsque votre méthode de requête renvoie une collection, la méthode de requête elle-même ne peut pas fermer la requête avant de renvoyer le résultat car la requête doit rester ouverte pendant que l'appelant parcourt les résultats. Cela met la responsabilité de fermer une requête qui renvoie une collection sur l'appelant et peut introduire des fuites si l'appelant néglige de fermer la requête - je pensais qu'il devait y avoir un moyen plus sûr et il y en a! Guido, un utilisateur DataNucleus de longue date, a créé une façade de collection 'fermeture automatique' qui enveloppe la collection renvoyée par la méthode Query.execute de JDO. L'utilisation est extrêmement simple: Enroulez le résultat d'une requête dans une instance de l'objet de collection de fermeture automatique:
au lieu de retourner le résultat de requête établi comme ceci:
return q.execute();
retourner simplement une version enveloppée « de fermeture automatique » de il:
return new JDOQueryResultCollection(q, q.execute());
pour l'appelant, il apparaît comme toute autre collection, mais l'emballage conserve une référence à la requête qui a créé le résultat de la collecte et ferme automatiquement lorsque l'emballage est éliminé par le GC. Guido nous a gentiment donné la permission d'inclure son code intelligent de fermeture automatique dans notre librairie open source exPOJO. Les classes de fermeture automatique sont complètement indépendantes de exPOJO et peuvent être utilisées isolément. Les classes d'intérêt sont dans le expojo_jdo * fichier .jar qui peut être téléchargé à partir de:
http://www.expojo.com/
JDOQueryResultCollection est la seule classe utilisée directement, mais elle a quelques classes de support.
Ajoutez simplement le fichier jar à votre projet et importez com.sas.framework.expojo.jdo.JDOQueryResultCollection dans n'importe quel fichier Java incluant des méthodes de requête qui renvoient les résultats en tant que collection.
Sinon, vous pouvez extraire les fichiers source du pot et de les inclure dans votre projet: Ils sont:
JDOQueryResultCollection.java
Disposable.java
AutoCloseQueryIterator.java
ReadonlyIterator.java