Как я могу использовать шаблон одноэлементного проектирования для установления и закрытия соединения JDBC? - PullRequest
0 голосов
/ 17 мая 2019

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

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

Но как мне закрыть соединение, если мой код выглядит так?Какие есть варианты?Я искал решение своей проблемы, но не смог найти.

Большое спасибо!Я действительно ценю все ваше время и усилия.

public class DbConnect {

    public static Connection con;
    public static Statement st;
    public static ResultSet rs;

    public DbConnect() throws SQLException{

       con = getDbConnection();
       st = con.createStatement();
       rs = null;
    }

    public static Connection getDbConnection(){
          try{
            Class.forName(("com.mysql.cj.jdbc.Driver"));

            con = DriverManager.getConnection( .... 
                  ....
}

public static void closeConnection() throws SQLException{
    con.close();
    st.close();
    rs.close();
}

// Пример того, как я его использую:

public void removeCustomer(String value) throws SQLException{

        String query="DELETE FROM customer WHERE idCustomer="+value;
        pst=DbConnect.con.prepareStatement(query); // THIS
        try {
            pst.executeUpdate();
        } catch (SQLException ex) {
                Logger.getLogger(CustomerRemover.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            pst.close();
        }

}

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Ваш учитель неверен. Помните, у вас есть две вещи, которые используют ресурсы. Ваше приложение и ваша база данных. Так, 1. Всегда используйте соглашение Try With Resources, чтобы ваши ресурсы были правильно закрыты. Я был свидетелем того, как большая софтверная компания использовала пул потоков для создания JDBC-соединений. База данных была недоступна около двух минут, но приложение продолжало пытаться устанавливать соединения, каждый раз создавая новый поток. Это было по сути утечкой памяти и привело к поломке всей системы. Используйте попробовать с ресурсами. 2. Наличие одного постоянного соединения дешевле для внешнего приложения, но экспоненциально дороже для базы данных. Общеизвестная базовая вещь, которую нужно сделать, это подключиться, выбрать и закрыть как можно быстрее.

1 голос
/ 17 мая 2019

Ваш учитель должен искать пулы соединений:)

Он прав, что открытие соединения с базой данных с аутентификацией и всем этим довольно дорого. Но эта проблема решается с пулами соединений. Таким образом, драйвер базы данных позаботится о том, чтобы соединение оставалось открытым.

Таким образом, вы можете просто открывать / закрывать соединение настолько открытым, насколько вы хотите: Открытие соединения проверит, существует ли уже открытое соединение в пуле соединений, а закрытие соединения просто вернет соединение в пул соединений.

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

Так что мое предложение действительно таково: когда вам нужно соединение, откройте его, используйте его и закройте потом. И обязательно используйте пул соединений.

Но если вы действительно хотите нам синглтон, используйте его правильно. Класс Singleton обычно имеет закрытый конструктор и статический метод для получения экземпляра. Экземпляр является статической переменной, которая устанавливается внутри статического конструктора (поэтому он определяется как статический закрытый экземпляр MyClass = new MyClass ();) или getInstance проверяет, является ли экземпляр нулевым, и создает первый экземпляр, если требуется (используя синхронизированный если несколько потоков пытаются вызвать getInstance одновременно!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...