Salı, Ekim 27, 2009

Java ResultSet'te neden satır sayısı bilgisi yok?

Merhabalar,

Bir çok yerde de tartışma konusu olduğu üzere java.sql.ResultSet sınıfı bünyesinde doğrudan satır sayısına ulaşabileceğimiz bir method barındırmıyor sebebi ise ;

100bin kayıt içeren bir tablo düşünün. Bu tabloya hiç bir kriteri olmayan bir sorgu gönderdiğinizde dönecek 100bin kayıtı RAM'de tutmak çokta akıl karı bir iş olmasa gerek ayrıca network'te yük oluşturduğunuzuda unutmayın. Bu yüzden bu kayıtlar belli gruplar halinde getirilirler (fetch) yani ResultSet objemizin kayıtların sayısı hakkında bir fikri yoktur. Veritabanı editörlerinde de bunu fark etmişsinizdir. Tablolardaki veriler siz tabloyu scroll ettikçe fetch edilirler. Tüm veriyi aynı anda getirmek performans darboğazları yaratabileceği gibi çoğu zamanda (%99) gereksizdir.

Satır sayısı bilgisinin gerekliliğine gelince. Bugüne kadar yazdığım hiçbir programda bu bilgiye ihtiyacım olmadı desem yalan söylemiş sayılmam ama bu bilgi benim için elzem diyorsanız gezilebilir (Scrollable) ResultSet kullanarak bu bilgiyi elde edebilirsiniz. Scrollable olmayan durumlarda ise Cursor tek yönlü olacağından ResultSet'te gezinmeye başladığınızda [myRS.next()] bir önceki kayıta dönmeniz mümkün olmayacaktır. ResultSet'ten satır sayısını bulabileceğimiz bir örnekle konuyu kapatalım,


Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR _READ_ONLY);

ResultSet rs = stmt.executeQuery(query);

int probablyUselessRecordCount = 0;
if (rs != null) {
rs.last(); // cursor'u sona ilerlet
probablyUselessRecordCount = rs.getRow(); //satır sayısını al
rs.beforeFirst();// ResultSet'te gezinmek için cursor'u başa al

}