2012-04-06 9 views
7

Po zamknięciu połączenia z bazą danych w java, mogę je ponownie otworzyć? Czy muszę ponownie wykonać numer DriverManager.getConnection()?Ponowne otwarcie połączenia z bazą danych w Javie

+4

Co jest tak trudne do wypróbowania? –

+0

Widzisz również otwartą metodę połączenia? – MrJames

+0

Nie widzę żadnej otwartej metody w połączeniu. Jak mogę to wypróbować? Wywołanie 'getConnection' będzie działało, wypróbowało to, ale czy jest to" poprawny "sposób? –

Odpowiedz

4

Nie jestem w 100% pewien, czy potrzebuje, aby zadzwonić pod numer DriverManager.getConnection(), ale co za szkoda? Już zamknąłeś połączenie, po prostu weź nowy, kiedy go potrzebujesz. Śmieciarz martwi się o to zamknięte połączenie po jego odrzuceniu.

1

Tak, nie możesz nic zrobić po zamknięciu połączenia. trzeba zadzwonić getConnection

0

Jak Javadoc wspomina:

getConnection: Attempts to establish a connection to the given database URL. 

Dlatego tak, nazywając getConnection() znowu wygląda jedyny sposób nawiązania nowego połączenia z bazą danych po zamknięciu poprzedniego połączenia.

7

Po wywołaniu connection.close();, connection (przyjmując typ java.sql.Connection) staje się bezużyteczny. Ta operacja zwalnia bazę danych tego obiektu połączenia i zasoby JDBC.

Więc Tak trzeba dostać świeże połączenie, gdy zanim będzie można przejść przez

connection = DriverManager.getConnection() 
+0

Właśnie zacząłem robić JDBC z połączeniami SQL Server po zrobieniu wszystkiego w C# i chłopak był wielką tajemnicą przez pół dnia wczoraj. – JoeManiaci

0

Well idealnie zrobiłem nieco innego podejścia i dał inne rozwiązanie.

Zamiast otwierać i zamykać bazę danych, co dosłownie dzieje się na każdym żądaniu klienta, wykonałem pojedynczą instancję klasy i wykonałem pojedyncze otwarte połączenie, które będzie ponownie wykorzystywane tak długo, jak długo serwer będzie działał.

W skrócie:

mam getConnection() wewnątrz Database klasy

public Connection getConnection() throws Exception { 
    try { 
     String connectionURL = "jdbc:mysql://localhost:3306/someDatabase"; 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if (connection == null) { 
      connection = DriverManager.getConnection(connectionURL, "someUser", LOCAL_MYSQL_PASSWORD); 
     } 

     return connection; 
    } catch (Exception e) { 
    } 

} 

Klasa Database Singleton, a tym samym ponowne użycie tej samej klasy i ponowne użycie tego samego połączenia.

Przetestowałem to przez show processList, a ten dał około 100 połączeń. Jeśli nie zamknę połączenia, a nawet jeśli zamknę połączenie, faktyczny proces prawdopodobnie nie zostanie zabity, ale zostanie uśpiony zamiast tego będzie on używany, gdy ten sam klient poprosi o to samo żądanie, ale jeśli masz 15 żądań, to każdy z nich będzie miał osobne procesy, więc zamknięcie i otwarcie połączenia nie było najlepszym rozwiązaniem.

Dzięki temu mam 1 pojedynczy proces, który jest odpowiedzialną warstwą dla zapytań.

Powiązane problemy