Według documentation dla getResultSet
w java.sql.Statement
, to mówi:getResultSet() „powinna być wywoływana tylko raz w wyniku”
Pobiera aktualny wynik jako obiekt ResultSet. Ta metoda powinna być wywołana tylko jeden raz na wynik.
Używając kodu testowego, wpadłem executeQuery()
i kilka połączeń do getResultSet()
i zauważył, że ResultSet
powrócił wskazał do tego samego obiektu. Zgaduję, że to nie jest zwracanie innego ResultSet
, które trzeba zamknąć indywidualnie. Ale oczywiście może to być unikalne dla moich sterowników JDBC.
Patrząc na documentation dla ResultSet
mówi:
domyślny obiekt ResultSet nie mogą być aktualizowane i zawiera kursor, który porusza się do przodu tylko . W związku z tym można go powtórzyć tylko raz i tylko od pierwszego do ostatniego wiersza.
Wydaje się, że to dobry powód, dla którego nie jest dobrym pomysłem wielokrotne wywoływanie, ponieważ może to doprowadzić do pewnej "sytuacji". Jeśli to był jedyny powód, czułem, że mogli to właśnie powiedzieć, więc myślę, że może być coś więcej niż to.
Więc czy ktoś wie dlaczego nie powinno się nazywać getResultSet
więcej niż raz w wyniku? Ta question jest tym, co mnie zaciekawiło.
Nie publikujesz tego jako odpowiedzi, ponieważ jest to tylko przeczucie, ale podejrzewam, że jest to sposób, aby dać trochę swobody programistom sterowników JDBC, pozwalając im nie definiować, co się stanie, gdy zadzwonisz do niego więcej niż raz. W twoim konkretnym przypadku działa, ale jeśli kiedykolwiek zmienisz sterowniki JDBC, może tak się nie stać. –
Myślę, że jest to równie proste: obiekt ResultSet ma stan. Istnieje tylko jeden obiekt ResultSet jako członek oświadczenia. Uzyskanie obiektu nie powoduje ponownego wykonania instrukcji. Uzyskanie obiektu po raz drugi nie gwarantuje, że będzie w tym samym stanie, co pierwszy, jeśli zmodyfikowałeś coś po pierwszym otrzymaniu. Jest to po prostu ostrożność. Patrząc na sterownik jdbc Postres (org.postgresql.jdbc2.AbstractJdbc2Statement), widzimy, że wewnętrznie wykonuje wiele takich połączeń: return (result! = Null && result.getResultSet()! = Null); – Glenn