Ich habe nach einer sehr langsamen SQL-Abfrage gesucht (die aus einer Java-App stammt, die Hibernate in JBoss 5.1 verwendet). Diese bestimmte Abfrage gab ungefähr 10K-Datensätze zurück, benötigte jedoch immer noch 40s oder mehr.Jede Lösung für Oracle TNS Ineffizienzen (viele Roundtrips, Latenz) von einer Java App?
Ich landete schnüffeln den Verkehr mit der Datenbank (wireshark hat einen Dissektor für TNS) und etwas unerwartetes gefunden. Wenn Daten vom Server kamen, befand sich jede Ergebniszeile in einem eigenen TNS-Paket. Außerdem wurde jedes TNS-Paket vom Client (d. H. Dem Anwendungsserver) bestätigt, bevor der nächste von der Datenbank gesendet wurde. Für 10K-Datensätze gibt es 10K-Roundtrips, um ein Paket zu erhalten und es zu bestätigen. Der Einfluss auf die Leistung ist enorm.
Das ist furchtbar ineffizient. TCP erlaubt größere Pakete und hat eine Reihe von Mechanismen (gleitende Fenster, verzögerte ACKs), um die Latenz zu reduzieren und den Durchsatz zu erhöhen. In diesem Fall ist es jedoch das TNS-Protokoll, das seine eigene Verhandlung hinzufügt.
Wenn ich dieselbe Abfrage vom Oracle SQL Developer ausführen, sehe ich dieses Muster nicht. Die Abfrage wird in etwa 1/10 der Zeit abgeschlossen, ohne Tausende von Rundreisen.
Kurzversion: Oracle-Drahtprotokoll (TNS) scheint Daten in einem TNS-Paket pro Abfrageergebniszeile zu übergeben und erfordert, dass jedes Paket vom Client bestätigt wird, bevor der Server den nächsten sendet.
Ich habe einige Informationen dazu [hier] [1] gefunden (scrollen Sie nach unten bis zum Abschnitt 'Die SDU und TDU Parameter in der tnsnames.ora Datei').
Und damit meine Frage: ist es möglich, das Verhalten des Oracle-Treibers zu steuern (ich verwende 10.2.0.4.0), so dass das TNS-Protokoll effizienter ist? Auch dies ist eine ziemlich normale J2EE-App, die in JBoss eingesetzt wird.
Vielen Dank!
Hey, danke für eingehende Frage mit ein paar Tipps für Leute mit ähnlichen Situationen .. Upgesprochen .. – TonyP