Java JDBC ignore setFetchSize?
Je suis en utilisant le code suivant
st = connection.createStatement(
ResultSet.CONCUR_READ_ONLY,
ResultSet.FETCH_FORWARD,
ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(1000);
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query");
La requête en retour beaucoup d' (800k) lignes et de prendre un temps important (~2m) entre l'impression de "query" et "fait de requête". Quand j'mettre manuellement une "limite de 10000" dans ma requête il n'y a pas de temps entre "démarrer" et "fait". Le traitement des résultats prend du temps donc je suppose que c'est globalement plus rapide si elle récupère 1k lignes à partir de la base de données, processus de ceux et quand il est à court de lignes qu'il peut obtenir de nouveaux en arrière-plan.
La ResultsSet.CONCUR_READ_ONLY etc où mon dernier deviner; suis-je raté quelque chose?
(c'est un serveur postgresql 8.3)
Voir aussi stackoverflow.com/a/47517489/32453
OriginalL'auteur kresjer | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
Essayez d'activer l'auto-commit off:
Référence
Il est intéressant de noter que vous avez probablement besoin à son tour de validation automatique de retour avant la fermeture de la connexion, si vous êtes en utilisant le regroupement de connexion, et d'autres parties de l'application s'appuyer sur validation. Sinon, vous pourriez vous retrouver avec des données aléatoires de perte lorsqu'il n'est pas explicitement de commettre.
Plus de détails sur cette JDBC PostgreSQL restriction peut être trouvé à l'adresse jdbc.postgresql.org/documentation/head/....
FWIW autoCommit est sur "on" par défaut, alors assurez-vous de varier d'elle...voir aussi les autres commentaires.
OriginalL'auteur dogbane
Cela dépendra de votre pilote. À partir de la documentation:
Note qu'il est dit "un soupçon" - je prendrais cela pour dire qu'un pilote ne peut ignorer l'indication, si elle le veut vraiment... et il semble que c'est ce qui se passe.
Son postgresql, donc vous devriez avoir accès à la source de la DB et les pilotes JDBC. Vous pouvez l'utiliser pour comprendre ce qui se passe réellement ...
NB que postgres (si autocommit, donc taille de l'extraction est de travailler) réglage de la taille de l'extraction de 0 apparemment il cache "tout" par défaut (je suppose que c'est la façon dont ils interprètent "ignorant" un soupçon) avec oracle la valeur par défaut est 10, apparemment, docs.oracle.com/cd/A97335_02/apps.102/a83724/resltse5.htm
OriginalL'auteur Jon Skeet
Les deux requêtes de faire des choses totalement différentes.
À l'aide de la
LIMIT
clause ne limite la taille de l'ensemble de résultats de 10000, tandis que le réglage de la taille de l'extraction n'est pas, il donne au contraire un indice pour le pilote de dire le nombre de lignes à récupérer à un moment lors d'une itération dans le jeu de résultats - qui comprend tous les 800k lignes.Donc, lorsque vous utilisez
setFetchSize
, la base de données crée le jeu de résultats complet, c'est pourquoi il est si long.Modifier pour plus de clarté:
Réglage de la taille de l'extraction ne fait rien à moins que vous itérer sur le résultat (voir Jon commentaire), mais la création d'un beaucoup plus petit ensemble de résultats via une LIMITE de fait une grande différence.
Bien sûr. La différence de vitesse est à cause de differenr tailles des ensembles de résultats, 10000 vs 800000.
OriginalL'auteur Henning
J'ai remarqué que votre utilisation de l'API est différent de ce qu'exprimée par Javadoc:
Essayer de passer les paramètres dans cet ordre
OriginalL'auteur Wishper