2012-12-19 6 views
8

dizisinden daha hızlıdır. n nesnesine sahip bir ResultSet rs varsayalım.(rs.next()), rs.absolute()

Bu kod:

for(i=1; i<=n; i++) { 
    rs.absolute(i) 
    // do something on rs 
} 

Ancak throughouts açısından bu karşılığı olan:

while(rs.next()) { 
    // do something on rs 
} 

(diğer bir deyişle her ikisi de aynı sonuçları verdi) bu koda algoritmically eşittir? İlk daha hızlı mı? Veya, belirli bir i için, rs.next() sadece rs.absolute(i+1) için bir sarıcı mı?

Saygılarımızla MC

+1

Kendinizi test etmenizi engelleyen nedir? Büyük olasılıkla, fark göz ardı edilebilir, bu nedenle okunması daha kolay olan kod kullanılmalıdır. –

+1

@ KlasLindbäck Doğru bir mikro benek yazımı yazmak şaşırtıcıdır [nontrivial] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java). –

+2

'rs.next()' ile sonuç kümesi boyutunu önceden bilmeniz gerekmez, 'rs.absolute() 'ile yapmanız gerekir. Bu, önceden ikinci bir sorgu anlamına gelir. – BalusC

cevap

6

rs.next yüzden çoğu durumda rs.absolute ile performans/kaynak verimliliği düşer rs.absolute daha veritabanı imleç (FORWARD_ONLY) daha basit bir tür gerektirir. Bazı durumlarda, FORWARD_ONLY imleci için herhangi bir optimizasyon bulunmadığı durumlarda, aynı performansı alabilirsiniz.

Bazı sürücüler, FORWARD_ONLY numaralı telefonlarda bile absolute çağrılarına izin verebilir, istenen kaydın bir diğeri olduğunu doğrulayabilir, ancak diğerleri yine de bir istisna atar.

+0

PreparedStatement'i readyStatement (SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE) olarak bildirdiysem; iki kod bloğu kesinlikle eşittir. Sağ? –

+0

Bu genel olarak cevaplanamaz çünkü bunların hepsi sürücüye sadece ipuçlarını verir. Bir farkın daha az şansı vardır, doğrudur, ama eminim ki karşı örnekler de vardır. –

+0

@Mariano, sürücünün uygulanmasına ve altta yatan veritabanının davranışına büyük ölçüde bağlı olacağından emin olmanın bir yolu yoktur. Genel olarak şunu söyleyebilirim: 'rs.next()' işlevini kullanarak bir ResultSet'i sıralı olarak kullanmak istiyorsanız, ancak bu sadece –

2

Önceki rs.next() eski uygulamalara bağlı olmasına ve gerçekte içsel en iyi duruma getirme nedeniyle aynı performansa sahip olmanıza rağmen daha hızlı olabilir.

rs.absolute() yaparken sürücü geçerli konumu dikkate almayabilir, bu nedenle biraz ileride biraz daha fazla olabilir, rs.next() ise yalnızca ileriye doğru ilerler.

Bu nedenle, tüm sonuçları yinelemeniz gerekiyorsa, rs.absolute() kullanın, belirli bir sonuç atlamak gerekiyorsa, rs.next() kullanın.

Sonuç kümesinin aslında veritabanı tarafından uzaktan ele alındığını unutmayın (bir CachedResultSet değilse), o zaman ileri gidip düşündüğünüzden daha fazla yükü içerebilir.

İlgili konular