Führen Sie mehrere Abfragen mit einem einzelnen JDBC-Anweisungsobjekt aus
Bitte Lesen Sie vor der Markierung dieser als Duplikat. Ich suchte eine Menge von google und SO, aber ich konnte nicht die genaue Antwort, die ich Suche.
Meine Frage: In JDBC, Kann ich einzelne Statement
Objekt aufrufen executeQuery("")
mehrere Male? Ist es sicher? ODER sollte ich in der Nähe des statement Objekts nach jeder Abfrage, und neues Objekt anlegen, der für das ausführen einer anderen Abfrage.
E. G:
Connection con;
Statement s;
ResultSet rs;
ResultSet rs2;
try
{
con = getConnection();
s = con.prepareStatement();
try
{
rs = s.executeQuery(".......................");
//process the result set rs
}
finally
{
close(rs);
}
//I know what to do to rs here
//But I am asking, should I close the Statement s here? Or can I use it again for the next query?
try
{
rs2 = s.executeQuery(".......................");
//process the result set rs2
}
finally
{
close(rs2);
}
}
finally
{
close(s);
close(con);
}
Kommentar zu dem Problem
Dieser thread kann informativ sein: java-forums.org/jdbc/69824-proper-use-preparedstatment.html
Re-verwenden Sie die
Aussage
- Instanz ist definitiv möglich, sogar empfohlen, aus performance-Gründen. InformationsquelleAutor der Frage Syed Aqeel Ashiq | 2014-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man ja wieder mit einem
Statement
(insbesondere einenPreparedStatement
) und so tun sollte im Allgemeinen mit JDBC. Es wäre ineffizient und schlechtem Stil, wenn Sie nicht re-verwenden Sie Ihre Aussage und schuf sofort ein identischesStatement
Objekt. Soweit es schließen, wäre es angemessen, um es zu schließen in einem finally-block, so wie Sie sind in diesem snippet.Ein Beispiel für das, was Sie sind, zu Fragen, check out this link: jOOq Docs
InformationsquelleAutor der Antwort Durandal
Ich bin nicht sicher, warum du fragst. Das API-design und-Dokumentation zeigen, es ist völlig in Ordnung (und sogar gewollt) die Wiederverwendung eines
Statement
Objekt für mehrereexecute
,executeUpdate
undexecuteQuery
Anrufe. Wenn es nicht erlaubt wäre, wäre explizit dokumentiert in der Java-doc (und wahrscheinlich die API anders wäre).Außerdem die apidoc unterbreitet der
Aussage
sagt:Dies ist ein Indiz dafür, dass Sie können es verwenden, mehrmals.
TL;DR: ja, Sie können anrufen
execute
auf einzelneStatement
Objekt mehrere Male, so lange, wie Sie erkennen, dass alle zuvor geöffnetenResultSet
geschlossen werden.Dein Beispiel falsch verwendet
PreparedStatement
, und Sie kann (oder: sollte nicht) in der Lage sein, rufen Sie dieausführen...
- Methoden akzeptieren einenString
auf einePreparedStatement
:Aber zu beantworten, für
PreparedStatement
als gut: der ganze Sinn einerPreparedStatement
ist precompile eine Anweisung mit Platzhalter für parameter und verwenden es für mehrere Ausführungen mit unterschiedlichen parameter-Werten.InformationsquelleAutor der Antwort Mark Rotteveel
Kann ich nicht finden, alles, was in der API-docs , wäre, dass man nicht anrufen
executeQuery()
auf einem bestimmtenPreparedStatement
Instanz mehr als einmal.Jedoch Ihr code nicht in der Nähe der
PreparedStatement
- ein AufrufexecuteQuery()
werfen würde eineSQLException
in diesem Fall - aber dieResultSet
zurückgegeben wirdexecuteQuery()
. Ein ResultSet ist automatisch geschlossen, wenn Sie erneut einePreparedStatement
. Je nach Umständen sollte man es schließen, wenn Sie brauchen es nicht mehr. Ich würde es schließen, weil ich denke, es ist schlechter Stil, es nicht zu tun.UPDATE Upps, verpasste ich dein Kommentar zwischen den beiden try-Blöcke. Wenn Sie Ihr PreparedStatement an diesem Punkt sollten Sie nicht in der Lage zu nennen executeQuery() wieder bekommen, ohne eine SQLException.
InformationsquelleAutor der Antwort Grmpfhmbl
Einen
Prepared Statement
sagt die Datenbank zum speichern der Abfrage und bereit sein, zu akzeptieren parametrisierten Variablen zum ausführen der Abfrage. Es ist ein viel wie eine gespeicherte Prozedur.Prepared Statement
führt die zwei wichtigsten Dinge:Automatisch entweicht Ihre query-Variablen zu schützen gegen SQL-Injection.
Es erzählt die Datenbank, zu erinnern, die Abfrage und bereit sein, zu nehmen Variablen.
Nummer 2 ist wichtig, weil es bedeutet, dass die Datenbank nur interpretieren Sie die Abfrage einmal und dann hat es das Verfahren bereit zu gehen. So ist es die Leistung verbessert.
Sollten Sie nicht in der Nähe einer vorbereiteten Anweisung und/oder die Datenbank-Verbindung zwischen execute-Aufrufe. Dabei ist es unglaublich wirkungsvoll-und es verursacht mehr Aufwand als mit einem einfachen alten
Statement
da Sie die Datenbank anweisen, jedes mal eine Prozedur erstellen, und vergessen Sie es. Auch wenn die Datenbank so konfiguriert ist, dass "hot-spots" und merkt sich die query sowieso, auch wenn Sie in der Nähe derPreparedStatement
Sie anfallen Netzwerk-overhead sowie kleine Bearbeitungszeit.Kurz gesagt, halten die
Connection
undPreparedStatement
öffnen, bis Sie fertig sind mit Ihnen.Edit: Zu kommentieren-nicht wieder eine
ResultSet
von der Ausführung, ist dies in Ordnung.executeQuery
zurückResultSet
für was auch immer-Abfrage nur ausgeführt.InformationsquelleAutor der Antwort SnakeDoc
Erstens bin ich verwirrt über Ihre code
Ist es gut funktioniert?Ich kann nicht finden, eine solche Funktion in der JAVA-API,ist mindestens ein parameter erforderlich ist.Vielleicht möchten Sie zum aufrufen dieser Funktion
Ich lief einfach mein code für den Zugriff auf DB2 für zweimal mit einer einzigen Anweisung Instanz, ohne schließen Sie es zwischen zwei Betrieb.Es ist gut funktionieren.Ich denke, Sie können versuchen, es selbst zu.
InformationsquelleAutor der Antwort mojiayi