#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.