2008-10-02 15 views
23

Ich habe eine JDBC-Abfrage ausgeführt, um eine Ergebnismenge zu erhalten. Bevor ich darüber iteriere, möchte ich schnell herausfinden, wie viele Zeilen zurückgegeben wurden. Wie kann ich das mit hoher Leistung erreichen?Wie bekomme ich die Zeilenanzahl in JDBC?

Ich bin mit Java 6, Oracle 11g und die neuesten Treiber Oracle JDBC.

Antwort

26

Sie werden das als eine separate Abfrage zu tun haben, zum Beispiel:

SELECT COUNT(1) FROM table_name 

Einige Treiber JDBC könnte Ihnen sagen, aber das ist nicht das Verhalten und mehr auf den Punkt, der Fahrer kann nicht weiß es noch. Dies kann daran liegen, wie die Abfrage optimiert wird, z. B. zwei beispielhafte Ausführungsstrategien in Oracle, um alle Zeilen so schnell wie möglich zu bekommen oder um die erste Zeile so schnell wie möglich zu bekommen.

Wenn Sie das tun zwei separate Abfragen (eine eine Zählung und die andere die Abfrage) dann müssen Sie sie innerhalb derselben Transaktion zu tun. Dies funktioniert bei Oracle gut, kann aber bei anderen Datenbanken problematisch sein (z. B. zeigt SQL Server entweder nicht festgeschriebene Daten oder blockiert bei einem externen nicht festgeschriebenen Update abhängig von Ihrer Isolationsstufe, während Oracle eine Isolationsstufe unterstützt, die Ihnen eine konsistent konsistente Sicht auf die Daten ohne Blockierung externer Updates).

Normalerweise obwohl es nicht Minster, wie viele Zeilen gibt. In der Regel wird diese Art von Abfrage entweder stapelweise oder seitenweise verarbeitet, und auf beide Arten haben Sie Fortschrittsinformationen in Form von Zeilen, die geladen/verarbeitet werden, und Sie können (natürlich) das Ende der Ergebnismenge erkennen.

+0

Gute Antwort, obwohl ich darüber, dass Fortschritte Informationen, um die letzte Bemerkung nicht verstehen. Woher kommt das? – Aktau

+0

Dies erfordert eine andere Abfrage. Wenn Sie eine scrollbare Ergebnismenge haben, gibt es bessere Möglichkeiten in anderen Antworten. – JDuarteDJ

18

Kurze Antwort: Sie können nicht.

Lange Antwort: Sie können nicht, zum Teil, weil die Datenbank faul sein kann, die Abfrage Auswertung nur Rückkehr Zeilen, wie Sie sie fragen.

EDIT: eine scrollbare ResultSet Verwenden Sie

der Tat kann :), fragte ich diese Frage in der Java-Newsgroup-Datenbanken vor langer Zeit (im Jahr 2001!) Und hatte einige helpful responses.

4

Wenn Ihr Treiber unterstützt es (!), Können Sie ResultSet.afterLast() aufrufen ResultSet.getRow() ResultSet.beforeFirst(). Leistung kann oder kann nicht gut sein.

Eine bessere Lösung wäre Ihr Algorithmus neu zu schreiben, nicht die Größe vorne zu verlangen.

15
ResultSet rs = stmt.executeQuery(sql); 
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :) 
+4

Funktioniert gut. Sie sollten hinzufügen, dass Sie dafür ein scrollbares Ergebnisset benötigen. –

+0

Unterstützen Sie den vorherigen Kommentar und ich denke, dies sollte die richtige Antwort sein, da es eine kürzere und direktere Möglichkeit bietet, es zu tun! – JDuarteDJ

+0

Wie funktioniert das? – Winter

0

Code:

//Create a Statement class to execute the SQL statement 
Statement stmt = con.createStatement(); 

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM 
TABLENAME"); 

while(rs.next()) { 
    System.out.println("The count is " + rs.getInt("COUNT")); 
} 

//Closing the connection 
con.close(); 
+0

Dies sollte die Antwort sein. Funktioniert perfekt. –

+1

Die Frage ist, wie viele Zeilen in Resultset. Nicht Zeilenanzahl der Tabelle – ernesto

10

Um die Anzahl der Zeilen aus JDBC zu erhalten:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME"); 
rs.next(); 
int count = rs.getInt(1); 
+3

Niemand fragt nach wie vielen Zeilen in einer Tabelle, die Frage ist, wie viele Zeilen in Ergebnismenge. – ernesto

Verwandte Themen