2010-10-08 20 views
6

Çok yavaş bir SQL sorgusuna bakıyordum (JBoss 5.1'de konuşlandırılan Hazırda Bekletme özelliğini kullanan bir Java uygulamasından kaynaklanan). Bu özel sorgu yaklaşık 10 bin kayıt döndürdü ancak yine de 40 veya daha fazla sürdü.Bir Java uygulamasından Oracle TNS verimsizlikleri (birçok gidiş geliş, gecikme) için herhangi bir çözüm var mı?

Veritabanındaki trafiği kokladım (wireshark TNS için bir disektöre sahip) ve beklenmedik bir şey buldu. Veriler sunucudan geldiğinde, her sonuç satırı kendi TNS paketindeydi. Ayrıca, her bir TNS paketi, bir diğeri veritabanından gönderilmeden önce istemci (yani uygulama sunucusu) tarafından onaylandı. 10K kayıtları için bir paket almak ve onaylamak için 10K gidiş dönüşler var. Performans üzerindeki etkisi çok büyük.

Bu çok verimsiz. TCP, daha büyük paketlere izin verir ve gecikmeyi azaltmak ve verimi artırmak için bir dizi mekanizmaya (kayan pencereler, gecikmeli ACK'ler) sahiptir. Ancak, bu durumda, kendi müzakeresini ekleyen TNS protokolüdür.

Aynı sorguyu Oracle'ın SQL Developer'ından çalıştırırsam, bu deseni göremiyorum. Sorgu, binlerce gidiş-dönüş olmadan yaklaşık 1/10'luk bir sürede tamamlanır.

kısa sürüm: Oracle tel protokolü (TNS) sorgu sonuç satıra bir TNS paket içinde veri iletmek için görünmektedir ve sunucu bir sonraki göndermeden önce müşteri tarafından kabul edilmesi için, her paket gerektirir.

Bu konuda bazı bilgiler buldum [here] [1] ('tnsnames.ora dosyasındaki' SDU ve TDU parametreleri 'bölümüne kadar ilerleyin).

Ve bu nedenle sorum şu: Oracle sürücüsünün davranışını kontrol etmek mümkün mü (10.2.0.4.0 kullanıyorum) TNS protokolü daha verimli? Yine, bu JBoss içinde konuşlandırılmış oldukça standart bir J2EE uygulaması.

Çok teşekkürler!

+0

Hey, derinlik için teşekkürler Benzer durumlara sahip insanlar için bazı ipuçları ile .. Oy verdi .. – TonyP

cevap

6

Telden ile tnsnames.ora ve listener.ora

içinde SDU ve TDU parametreleri başlatmaya deneyebilirsiniz Mevcut durum için 100'e.

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

Not:

Önalım boyutunun ayarlanması bir uygulamanın performans etkileyebilir. Ön getirme boyutunu artırarak, tüm verileri almak için gereken gidiş-dönüş sayısını azaltır, ancak bellek kullanımını artırır. Bu , sorgudaki sütunlarının sayısına ve boyutuna ve döndürülmesi beklenen satır sayısına bağlıdır. da, JDBC istemci makinesinin belleğine ve CPU yüklenmesine bağlı olacaktır. Bağımsız bir istemci için en uygun uygulaması, çok yüklü bir uygulama sunucusundan farklı olacaktır.Ağ bağlantının hızı ve gecikme de olmalıdır consideredconnection de dikkate alınmalıdır

mevcut bağlantı özellikleri here (Oracle Database JDBC Developer's Guide and Reference itibaren).

Ayrıca Oracle UCP da bir göz atın.

+0

Teşekkürler, satır önyükleme işleminden sonra şunları buldum: "Standart JDBC, sonuç kümesini her seferinde bir satır alır ve her satır, veritabanına gidiş dönüş gerektirir" http://download.oracle.com/docs/cd/ Gördüğüm şeyi açıklayan B19306_01/java.102/b14355/oraperf.htm. Hmm .. veri kaynağı seviyesinde ayarlamak mümkün mü? Http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html adresindeki parametrelerin listesi, prefetch için bir ayar içermez. – wishihadabettername

+1

Bu arada, http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/urls.htm#i1006362 – wishihadabettername

+0

adresinde bir sürücü özelliği (defaultRowPrefetch) buldum UCP kullanıyor musunuz? http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html – oluies

3

Satement nesnesinin alma boyutunu artırmaya çalışın.

varsayılan 10 olduğunu düşünüyorum, bu yüzden toplu boyutunu ayarlamak için 100.

 
Statement stmt = connection.createStatement(); 
stmt.setFetchSize(100); 
ResultSet rs = stmt.executeQuery("SELECT ..."); 
+0

Gerçekte, TCP paketlerini doldurarak getirilen boyutunu artırın. – wishihadabettername

İlgili konular