Объект подключения JDBC автоматически закрывается после выполнения статического блока и как модулировать код

#java #mysql #sql #jdbc

#java #mysql #sql #jdbc

Вопрос:

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

Один из способов, который я придумал, чтобы обойти это, — поместить инициализацию соединения и объекта оператора в статический блок. И непосредственно запустите инструкцию command.executeUpdate(SQLStatement).

Но это выдает ошибку, что объект подключения не инициализирован.

Код для этого выглядит следующим образом:

 class Database{
static final String JDBC_DRIVER = "....";  
    static final String DB_URL = "...";

    static final String USER = ".....";
    static final String PASS = ".....";
    static Connection conn  = null;   // Connection object for creating a connection with the Database
    static Statement  stmt  = null;   // Statement  object to  run queries on first table in  Database

    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn  = DriverManager.getConnection(DB_URL,USER,PASS);
            stmt  = conn.createStatement();
        }catch(SQLException se){
            se.printStackTrace();
        }catch(Exception e){  //Handle errors for Class.forName
            e.printStackTrace();
        }finally{  //finally block used to close resources
            try{
                if(stmt!=null){
                    stmt.close();
                }
            }catch(SQLException se2){
                System.out.println("caught a SQLException "   se2   " AND NOTHING CAN BE DONE ABOUT IT");
                // nothing we can do
            }
            try{
                if(conn!=null){
                    conn.close();
                }
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
    }

    public static void runSqlCommand(String command)throws java.lang.Exception{
        stmt.executeUpdate(command); // This gives an error that connection is not initialized.
    }

}
  

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

Также, пожалуйста, скажите, на сколько должна быть улучшена производительность, если я инициализирую объекты только один раз, а не для каждой команды sql.

Комментарии:

1. Почему вы не хотите каждый раз создавать соединение и оператор? Это, как правило, более чистый IMO (и позволяет избежать наличия такого большого количества кода при инициализации класса, ожидая выхода из строя всей системы из-за одного временного сбоя). сбой). Используйте пул соединений для автоматической обработки кэширования соединений и операторов, поэтому коду вашего приложения не нужно беспокоиться об этом.

Ответ №1:

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

Ответ №2:

Компилятор правильно сообщает вам, что существует путь выполнения, по которому ‘stmt’ не инициализируется, а именно, если вы получаете исключение, открывающее соединение.

Но в любом случае, поскольку вы тщательно закрываете как оператор, так и соединение в статическом блоке, все упражнение в первую очередь совершенно бессмысленно.

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

Ответ №3:

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