2012-09-04 8 views
5

Witam wszystkich wiedziałem, że to stare pytanie, ale po prostu ciekawy dzisiaj. Jak wiemy connection.close również zamknie readyStatement (popraw mnie jeśli się mylę). ale co jeśli ja zamknąć połączenie następnie zamknij PreparedStatementPołączenie Jdbc zamknij i przygotuj zamknij

conn.close(); 
ps.close(); 

Czy dostanę wyjątek NullPointer?

Ktoś mówił, zależy od twojej szybkości jvm.sometimes ps.close() będzie działał naprzód i zamknie się najpierw zanim conn.close zakończy swoją pracę, więc nie dostaniesz nullpointer.

W celu sprawdzenia, że ​​mam zmodyfikowany kod

conn.close(); 
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough 
ps.close(); 

Ale nie dostać NullPointer.

Moje pytanie brzmi, co się tutaj stało, gdy najpierw zamknę połączenie, a następnie ps.

dziękuję wszystkim.

Odpowiedz

4

Javadoc dla Statement.close() stany:

wywołanie metody close na Statement obiektu, który jest już zamknięta nie ma znaczenia.

Sugerowałbym, że oznacza to implementacja powinna rzucać żadnych wyjątków, jeśli rachunek został już zamknięty przez wywołanie Connection.close().

0

To zachowanie jest specyficzne dla implementacji sterownika lub implementacji puli połączeń. Zasadniczo dekorują one podstawowe połączenie/zestawienie/zestaw wyników i śledzą ich stan. Tak więc implementacja może wybrać zamknięcie zależnych obiektów przed zamknięciem podstawowych. Primrose moduł do łączenia połączeń używany do drukowania ostrzeżeń o niezamkniętych wyciągach lub wynikach, gdy metoda close() jest wywoływana na Connection (która jest nadpisywana, aby przywrócić połączenie z pulą).

+0

Specyfikacja JDBC jasno o tym mówi: zamknięcie połączenia zamyka wszystkie zależne obiekty (przynajmniej z punktu widzenia użytkownika, w przypadku łączenia instrukcja może pozostać otwarta w puli, ale uchwyt użytkownika do tej instrukcji powinien zachowywać się tak, jakby był zamknięty). Zamknięcie już zamkniętego zasobu JDBC (połączenie, instrukcja, zestaw wyników itd.) Nie powinno mieć żadnego efektu (brak błędów itp.). –

+0

Mówiłem o dekorowanym połączeniu, które jest zwracane przez graczy, a bliskie połączenie z tak udekorowanym połączeniem nie zamyka podstawowego połączenia fizycznego. Zgadzamy się na to prawo? Teraz gracze mogą sprawdzić wyciągi/zestawy wyników odpowiadające temu połączeniu i zamknąć je w zamkniętym wywołaniu połączenia, prawda? Mam nadzieję, że cię poprawiłem. – Vikdor

1

Jak na javadoc Oświadczenia interfejsu

close 
void close() 
      throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

więc tam nie będzie żadnego problemu, jeśli zamknąć już zamknięty oświadczenie.