Domanda

Ho eseguito una query JDBC per ottenere un gruppo di risultati. Prima di iterare su di esso, vorrei scoprire rapidamente quante righe sono state restituite. Come posso farlo ad alte prestazioni?

Sto usando Java 6, Oracle 11g e i driver Oracle JDBC più recenti.

È stato utile?

Soluzione

Dovrai farlo come una query separata, ad esempio:

SELECT COUNT(1) FROM table_name

Alcuni driver JDBC potrebbero dirti, ma questo è un comportamento facoltativo e, più precisamente, il driver potrebbe non saperlo ancora. Ciò può essere dovuto al modo in cui la query è ottimizzata, ad esempio due strategie di esecuzione di esempio in Oracle sono ottenere tutte le righe il più rapidamente possibile o ottenere la prima riga il più rapidamente possibile.

Se esegui due query separate (una conteggio e l'altra con la query), dovrai eseguirle all'interno della stessa transazione. Funzionerà bene su Oracle ma può essere problematico su altri database (ad es. SQL Server mostrerà i tuoi dati non sottoposti a commit o bloccherà un aggiornamento esterno non confermato a seconda del tuo livello di isolamento mentre Oracle supporta un livello di isolamento che ti offre una visione transazionale coerente del dati senza blocco su aggiornamenti esterni).

Di solito non importa quante file ci siano. In genere questo tipo di query viene elaborato in batch o impaginato e in entrambi i casi si hanno informazioni sullo stato di avanzamento sotto forma di righe caricate / elaborate e è possibile rilevare la fine del set di risultati (ovviamente).

Altri suggerimenti

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! :)

Risposta breve: non puoi.

Risposta lunga: non puoi, in parte perché il database potrebbe valutare pigramente la query, restituendo solo le righe quando le chiedi.

MODIFICA: usando un ResultSet scorrevole puoi :)

In effetti, ho posto questa domanda nel newsgroup dei database Java molto tempo fa (nel 2001!) e avevo un po 'di risposte utili .

Per ottenere il numero di righe da JDBC:

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

Se il tuo driver lo supporta (!), puoi chiamare ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). Le prestazioni possono essere o non essere buone.

Una soluzione migliore sarebbe quella di riscrivere il tuo algoritmo per non richiedere le dimensioni in anticipo.

Senza operatore ternario

rs.last();  // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow();  //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.

Con operatore ternario una riga

int rowCount = rs.last() ? rs.getRow() : 0; 
rs.beforeFirst();

Codice:

//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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top