Dove chiudere una connessione JDBC, mentre io voglio tornare il ResultSet
In realtà, hai quasi risposto a questa domanda da solo. Come hai sperimentato, la chiusura dello Connection
rilascerà le risorse JDBC ad esso associate (almeno, questo è il modo in cui le cose dovrebbero funzionare). Quindi, se vuoi restituire un ResultSet
(tornerò su questo più tardi), devi chiudere la connessione "più tardi". Un modo per fare questo sarebbe ovviamente quello di passare una connessione con il metodo, qualcosa di simile:
public ResultSet executeQuery(Connection conn, String sql, String[] getValue);
Il problema è che io non so davvero che cosa è il vostro obiettivo finale e perché avete bisogno di roba così basso livello quindi non sono sicuro che questo sia un buon consiglio. A meno che non si stia scrivendo un framework JDBC di basso livello (e, per favore, non dirmi che non lo stai facendo), in realtà non consiglio di restituire uno ResultSet
. Ad esempio, se si desidera alimentare un po 'di business class, restituire alcuni oggetti indipendenti da JDBC o una loro raccolta come altri hanno consigliato invece di un ResultSet
. Tieni anche presente che uno RowSet
è a ResultSet
quindi se non dovresti usare un ResultSet
allora non dovresti usare un RowSet
.
Personalmente, penso che dovresti usare qualche classe di supporto invece di reinventare la ruota. Mentre Spring potrebbe essere eccessivo e ha un po 'di curve di apprendimento (troppo se non lo sai affatto), Spring non è l'unica strada da percorrere e consiglio vivamente di dare un'occhiata a Commons DbUtils. Più in particolare, guarda QueryRunner
e soprattutto questa query()
metodo:
public <T> T query(String sql,
ResultSetHandler<T> rsh,
Object... params)
throws SQLException
Come si può vedere, questo metodo consente di passare un ResultSetHandler
che espone un metodo di callback per convertire ResultSets
in altri oggetti, come descritto nella z5h's answer e DbUtils fornisce diversi implementazioni, prendi semplicemente quello che si adatta alle tue esigenze. Dai anche un'occhiata ai metodi di utilità della classe DbUtils
, ad esempio i vari DbUnit.close()
che potresti trovare utile per chiudere le risorse JDBC.
Davvero, a meno che non si abbiano ottime ragioni per farlo (e sarei curioso di conoscerle), non scrivere ancora un altro framework JDBC, utilizzare una soluzione esistente, vi farà risparmiare un po 'di dolore e, più importante, alcuni bug e trarrai vantaggio da un buon design comprovato. Anche per cose di basso livello, ci sono soluzioni esistenti (e semplici) come abbiamo visto. Almeno, dai un'occhiata.
Si sta tentando di trasmettere il resultSet, vale a dire evitare la semplice lettura di tutti i risultati in una sorta di raccolta e di ritorno che? –
Fuori tema, perché tutti usano questo stile? !!! Questo è Java non C# – OscarRyz
Grazie a tutti voi, cordiali saluti! È quasi mattina in Cina, ma sono troppo toccato da voi e dalle vostre brillanti risposte per dormire. Questa è la mia prima domanda su Stackoverflow.com. Apprezzo molto il vostro aiuto. Sarò un frequentatore qui! – Aloong