Я хочу написать небольшое приложение, работающее с базой данных MySQL. Однако после прочтения этой две темы, ниже я запуталась, что это правильный способ работы с подключением к базе данных:Открытие и закрытие соединения в приложении JavaFX
is it safe to keep database connections open for long time
Closing Database Connections in Java
Одно сказать, что я должен держать соединение в течение длительного времени и отчетности короткой , и во-вторых, я должен закрыть все как можно скорее.
Какой из лучших/правильных способов?
Пример 1:
private void query(){
final String query = "SELECT * FROM database;";
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");
dataSource.setDatabaseName("database");
dataSource.setUser("root");
dataSource.setPassword("password");
try(Connection connection = dataSource.getConnection()){
try(PreparedStatement preparedStatement = connection.prepareStatement(query)){
try(ResultSet resultSet = preparedStatement.executeQuery()){
//--- working with resultset
}
}
}catch(Exception exception){
//---- handling exception
};
}
или это нормально, чтобы открыть соединение, которое будет продолжаться до тех пор, приложение не будет закрыто:
Пример 2:
public class Main extends Application {
public static Connection connection; //I will use this everywhere
@Override
public void start(Stage primaryStage) {
//============ opening connection and setting on close request
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");
dataSource.setDatabaseName("database");
dataSource.setUser("root");
dataSource.setPassword("password");
try {
connection = dataSource.getConnection();
System.out.println("connected to " + dataSource.getDatabaseName());
} catch (SQLException e) {
//---- exception
}
primaryStage.setOnCloseRequest(e->{
try {
connection.close();
System.out.println("connection closed");
} catch (Exception exc) {
System.err.println("couldn't close connection");
}
});
try {
BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource(CONSTANTS.ROOT_MAIN_WINDOW.string));
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("/view/application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
или может быть, вы знать лучше?
Я узнал, что только в первый раз подключение к серверу занимает много времени. Когда я делаю это снова, это намного быстрее. Теперь я думаю, что в первом примере будет лучше и безопаснее использовать код. – Tomasz
Похоже, что реализация источника данных кэширует открытое соединение для вас. Поэтому, когда вы извлекаете его в первый раз, он открывает его; когда вы «закрываете» его (неявно через конструкцию try-with-resources), он держит его открытым, но помечает его как доступный снова. Затем последующие вызовы 'getConnection()' занимают меньше времени. Он может также реализовать пул для вас: я не знаком с 'MysqlDataSource'. –
_ Если вы откроете соединение, когда вам это нужно, и избавитесь от него, когда вы закончите, на самом деле это не приведет к закрытию соединения, оно просто вернет его в пул соединений, который будет использоваться снова._ Найдено здесь: [ссылка] (http://programmers.stackexchange.com/questions/142065/creating-database-connections-do-it-once-or-for-each-query). Вы думаете, что это так же с java? – Tomasz