Toute solution pour inefficacités Oracle TNS (de nombreux allers-retours, latence) d'une application Java?

StackOverflow https://stackoverflow.com/questions/3893943

  •  28-09-2019
  •  | 
  •  

Question

je regardais une requête SQL très lent (provenant d'une application Java à l'aide Hibernate déployée dans JBoss 5.1). Cette requête particulière est revenu sur les dossiers 10K mais a pris 40 ou plus.

J'ai fini par renifler le trafic avec la base de données (Wireshark un dissecteur pour TNS) et a trouvé quelque chose d'inattendu. Lorsque les données ont été en provenance du serveur, chaque ligne de résultat était dans son propre paquet de TNS. De plus, chaque paquet TNS a été reconnu par le client (à savoir le serveur d'application) avant que la suivante a été envoyé à partir de la base de données. Pour 10K records, il y a 10K allers-retours pour obtenir un paquet et accuser réception. L'impact sur les performances est énorme.

Ceci est terriblement inefficace. TCP permet de plus grands paquets et a un certain nombre de mécanismes pour réduire la latence et augmenter le débit (fenêtres coulissantes, ACKs retardées). Cependant, dans ce cas, il est le protocole TNS sur le dessus qui ajoute sa propre négociation.

Si je lance la même requête SQL Developer à partir de l'Oracle, je ne vois pas ce modèle. La requête finalise à environ 1/10 du temps, des milliers de sans allers-retours.

Version courte : le protocole de fil d'Oracle (TNS) semble transmettre des données dans un paquet TNS par ligne de résultat requête et exige que chaque paquet doit être reconnu par le client avant que le serveur envoie le suivant <. / p>

J'ai trouvé quelques informations à ce sujet [ici] [1] (défilement vers le bas jusqu'à la section « Le SDU et les paramètres de TDU dans le fichier tnsnames.ora »).

Et donc ma question: est-il possible de contrôler le comportement du pilote Oracle (j'utilise 10.2.0.4.0) de sorte que le protocole TNS est plus efficace? Encore une fois, ceci est une application J2EE assez standard déployé dans JBoss.

Merci beaucoup!

Était-ce utile?

La solution

SDU et TDU paramètres dans tnsnames.ora et listener.ora

Pour définir la taille du lot à 100 pour la statment actuelle.

  ((OracleStatement)stmt).setRowPrefetch (100);

Note:

  

Réglage de la taille de prélecture peut affecter   la performance d'une application.   L'augmentation de la taille de prélecture volonté   réduire le nombre de voyages aller-retour   nécessaire pour obtenir toutes les données, mais   augmenter l'utilisation de la mémoire. Cette volonté   en fonction du nombre et de la taille de la   colonnes dans la requête et le nombre de   les lignes devraient être retournés. Ce sera   dépendra également de la mémoire et le processeur   chargement de la machine client JDBC.   L'optimum pour un client autonome   application sera différent d'un   serveur d'application très chargé. le   la vitesse et la latence du réseau   connexion devrait également être consideredconnection devrait également être envisagée

(de Oracle Database Guide de développement et référence JDBC )

Propriétés de connexion disponibles .

Aussi jeter un oeil à Oracle UCP aussi .

Autres conseils

Essayez d'augmenter la taille de votre chercher objet satement.

Je pense que la valeur par défaut est 10, vous pouvez essayer de commencer par 100.

Statement stmt = connection.createStatement();
stmt.setFetchSize(100);
ResultSet rs = stmt.executeQuery("SELECT ...");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top