2015-04-06 7 views
0

Я хочу написать небольшое приложение, работающее с базой данных 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); 
    } 
} 

или может быть, вы знать лучше?

ответ

1

Нет противоречия между двумя вопросами, которые вы цитируете. Первый говорит: «Хорошо держать связь открытой в течение длительного времени». Второй говорит: «Вы должны закрыть соединение, когда закончите с ним». Таким образом, вы можете держать его открытым до тех пор, пока вы хотите, пока вы закрываете его, как только вы закончите. То, что вы не должны делать, это неоднократно открывать новые подключения и не закрывать их.

В частности, открытие соединения требует много времени. Таким образом, вы на самом деле хотите избежать слишком часто этого; способностью открыть соединение является способом достижения этого.

В серверном приложении наличие единого соединения создаст узкое место при попытке обслуживания запросов от нескольких пользователей. В этом случае необходимо использовать пул соединений (сервер приложений предоставит эту функцию). В клиентском приложении, таком как приложение JavaFX, в типичном использовании соединение используется только в ответ на действие одного пользователя, поэтому использование одного соединения является разумным подходом.

+0

Я узнал, что только в первый раз подключение к серверу занимает много времени. Когда я делаю это снова, это намного быстрее. Теперь я думаю, что в первом примере будет лучше и безопаснее использовать код. – Tomasz

+0

Похоже, что реализация источника данных кэширует открытое соединение для вас. Поэтому, когда вы извлекаете его в первый раз, он открывает его; когда вы «закрываете» его (неявно через конструкцию try-with-resources), он держит его открытым, но помечает его как доступный снова. Затем последующие вызовы 'getConnection()' занимают меньше времени. Он может также реализовать пул для вас: я не знаком с 'MysqlDataSource'. –

+0

_ Если вы откроете соединение, когда вам это нужно, и избавитесь от него, когда вы закончите, на самом деле это не приведет к закрытию соединения, оно просто вернет его в пул соединений, который будет использоваться снова._ Найдено здесь: [ссылка] (http://programmers.stackexchange.com/questions/142065/creating-database-connections-do-it-once-or-for-each-query). Вы думаете, что это так же с java? – Tomasz