Comment gérer un grand ensemble de données à l'aide de Printemps, Référentiels de Données?
J'ai un grand tableau que j'aimerais accès via une source de Données du Référentiel.
Actuellement, je suis en train d'étendre le PagingAndSortingRepository
interface, mais il semble que je ne peut définir des méthodes qui renvoient des listes, par exemple.:
public interface MyRepository extends
PagingAndSortingRepository<MyEntity, Integer>
{
@Query(value="SELECT * ...")
List<MyEntity> myQuery(Pageable p);
}
D'autre part, la findAll()
méthode qui vient avec PagingAndSortingRepository
retourne un Iterable
(et je suppose que les données n'est pas chargé en mémoire).
Est-il possible de définir des requêtes qui retournent également Itérable et/ou de ne pas charger toutes les données en mémoire à la fois?
Existe-il des solutions de rechange pour la manipulation de grandes tables?
List
met en œuvre laIterable
interface, de sorte que votre requête personnalisée méthode retourne unIterable
.- Je suppose que le Printemps de Données ne prend pas en charge tout en mémoire lorsque j'utilise findAll(), je me trompe? Je vais modifier la question.
- La implémentation sous-jacente récupère simplement une liste, de sorte qu'il n'est pas sophistiquée.
- Je vois, merci pour l'explication. Par la voie, comment voulez-vous résoudre le problème? Est l'aide de Paginable paramètres de la seule façon de ne pas charger le tout dans la mémoire?
Vous devez vous connecter pour publier un commentaire.
Nous avons le classique de la consultation de réponse ici: ça dépend. Comme la mise en œuvre de la méthode est de stocker spécifiques, nous dépendons de la banque sous-jacente de l'API. En cas de JPA il n'y a aucune chance de fournir un accès en continu comme
….getResultList()
renvoie uneList
. Donc nous exposent également laList
pour le client comme particulièrement JPA développeurs peuvent être utilisés pour travailler avec des listes. Donc, pour JPA, la seule option est d'utiliser la pagination de l'API.Pour un magasin comme Neo4j nous soutenons l'accès en continu comme les référentiels de retour
Iterable
sur les méthodes CRUD ainsi que sur l'exécution de méthodes finder.LazyLoadingException
. Quel est le problème avec l'accès à unPage
, itérer sur le contenu et répéter que siPage.hasNext()
esttrue
? Cela rend au moins évidente que vous obtenez session limites du référentiel niveau, sauf si vous êtes dans une plus large étendue de transaction.La la mise en œuvre de
findAll()
simplement les charges de l'ensemble de la liste de toutes les entités en mémoire. SonIterable
type de retour ne signifie pas qu'elle met en œuvre une sorte de base de données au niveau du curseur de la manipulation.Sur l'autre main personnalisé de votre
myQuery(Pageable)
méthode de chargement d'une page vaut la peine d'entités, car l'généré la mise en œuvre des honneurs de sonPageable
paramètre. Vous pouvez déclarer son type de retour, soit commePage
ouList
. Dans le dernier cas, vous recevez toujours le même (restreint) nombre d'entités, mais pas les métadonnées d'unPage
serait en outre porter.Donc en gros, vous avez fait la bonne chose pour éviter le chargement de toutes les entités en mémoire dans votre requête personnalisée.
Veuillez consulter le documentation connexe ici.