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
Odpowiedz
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.
Tak, nie możesz nic zrobić po zamknięciu połączenia. trzeba zadzwonić getConnection
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.
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()
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
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ń.
Co jest tak trudne do wypróbowania? –
Widzisz również otwartą metodę połączenia? – MrJames
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? –