У меня есть класс, который использует блок инициализации static
для настройки соединения с базой данных. Класс имеет много методов public static
, которые запрашивают db. Я хотел бы правильно закрыть это соединение в блоке static
, который выполняется непосредственно перед завершением программы, вроде как блок finally
в try/catch
. Я почти уверен, что что-то вроде этого не существует на Java. Является ли мой лучший способ открыть и закрыть соединение с каждым запросом?Статический блок finally в Java
ответ
Посмотрите на это: Running a method when closing the program?
Вы можете попробовать написать код, чтобы закрыть соединение в этом методе.
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
//code to close connection
}
}, "Shutdown-thread"));
}
Вышеприведенный код работает нормально, когда приложение выходит из системы. Если виртуальная машина прерывается, то не может быть гарантирована, будут ли выполняться какие-либо выключения. – Sridhar
Вопрос: ** Является ли мой лучший вариант открывать и закрывать соединение с каждым запросом? ** – mustangDC
Если у вас слишком много запросов, не рекомендуется открывать и закрывать соединение с каждым запросом. Это увеличит ваши строки кода и вызовет ненужные накладные расходы. Использование shutDownHook может уменьшить все это. – Ridhima
Открытие и закрытие соединения для каждого запроса, которые повлекут за собой дополнительную нагрузку на систему, делая приложение медленно.
Вы могли бы окружить окончательного запрос вашей БД программы с попыткой улова блоками вместо этого и освободить соединение в пункте наконец (для последнего запроса вашей программы).
ПРИМЕЧАНИЕ. Если JVM завершается до того, как основной поток завершит выполнение, то есть выполнит команду System.exit(), последующий код и блок finally не будут выполнены.
Является ли это лучшим вариантом для открытия и закрытия соединения с каждым запросом? Ans: НЕТ
Я хотел бы предложить вам следовать:
Singleton Class
для открытия соединения, что-то вроде этого:
public class connectDB {
static Connection conn = null;
public static Connection getConnection(){
if (conn != null) return conn;
String connString = "DATABASE ACCESS URL HERE";
return getConnection(connString);
}
private static Connection getConnection(String conString){
try{
Class.forName("LOAD DRIVER HERE");
String uname = "DB USERNAME";
String pass = "DB PASSWORD";
conn = DriverManager.getConnection(conString, uname, pass);
}
catch(Exception e){
//Handle Exceptions
e.printStackTrace(); //<--Retrieves the error/Exception for you
}
return conn;
}
}
И закрыть соединение с чем-то вроде:
public static void closeConnection(Connection conn) {
try {
conn.close();
}
catch (SQLException e) {
//Handle Exception Here
}
}
Просто позвоните conn = connectDB.getConnection()
для связи, а другой o пе для закрытия, предпочтительнее в finally
public class JdbcDBManager {
private Connection connection = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
public JdbcDBManager(String url, String user, String pass) throws ClassNotFoundException, SQLException {
Class.forName("org.gjt.mm.mysql.Driver");
this.connection = DriverManager.getConnection(url, user, pass);
}
public void close() {
try {if (this.preparedStatement != null)this.preparedStatement.close();} catch (Exception e) {e.printStackTrace();}
try {if (this.resultSet != null)this.resultSet.close();} catch (Exception e) {e.printStackTrace();}
try {if (this.connection != null)this.connection.close();} catch (Exception e) {e.printStackTrace();}
}
public void customerInsert(Customer customer) {
try {
String query = "INSERT INTO customer(email,product) VALUES(?,?,?,?,?)";
this.preparedStatement = this.connection.prepareStatement(query);
this.preparedStatement.setString(1, customer.getEmail());
this.preparedStatement.setString(3, customer.getProduct());
} catch (Exception e) { e.printStackTrace();}
}}
Вы можете создать объект для каждой базы данных, и когда вы, наконец, сделали обработку близко его.
public class test {
public static void process() throws ClassNotFoundException, SQLException {
JdbcDBManager customerDB = new JdbcDBManager(JdbcURL.URL, JdbcURL.USER, JdbcURL.PASS);
try {
customerDB.insertCustomer(Customer customer);
doSomething(customerDB); // Pass db object as a parameter
} finally { customerDB.close();} // close it when you are finally done
}
doSomething(JdbcDBManager customerDB){
---------------------------
--process info in db-------
} }
Таким образом, вы открытое соединение за один раз и закрытия, когда процесс, наконец, закончил
- 1. Статический блок в Java
- 2. блок try-catch-finally в java
- 3. Запустить статический блок в java
- 4. Вам действительно нужен блок «finally»
- 5. Java ServletContextEventHandler и статический блок
- 6. Статический блок в Ruby
- 7. За верхом статический блок класса в java
- 8. Статический блок и статические переменные в java
- 9. Когда статический блок экземпляра в Java класса
- 10. Зачем использовать статический блок инициализации в java?
- 11. Статический блок в Java не выполнен
- 12. Java статический блок не работает в потоке
- 13. Статический блок Не обрабатывается в java
- 14. Как и когда выполняется блок finally?
- 15. Как отлаживать блок finally в Visual Studio?
- 16. Статический блок и нормальный блок
- 17. Java: Когда полезен статический блок инициализации?
- 18. JAVA Сколько раз выполняется статический блок?
- 19. статический блок инициализации против конструктора Java
- 20. Допустимые команды, которые сохраняют блок finally от выполнения на Java
- 21. Является ли блок finally без блока catch java anti-pattern?
- 22. Когда выполняется блок finally, если блок catch содержит оператор continue?
- 23. Что произойдет, если блок finally выдает исключение?
- 24. Что заставляет блок finally выполнить слишком скоро?
- 25. Статический блок не называется
- 26. Статический блок не запуская
- 27. Выполняет ли блок C# «finally» ВСЕГДА?
- 28. как обладать попытками объявить блок finally также?
- 29. Статический блок на results.phtml
- 30. Статический блок инициализации пропускает
возможный дубликат [Как обеспечить кусок кода выполняется перед выходом из приложения Java] (HTTP: // StackOverflow .com/questions/13754263/how-to-sure-a-of-code-is-run-before-exiting-a-java-приложение) –
Вам действительно нужно опубликовать код. Но, вообще говоря, статическая переменная соединения после инициализации останется доступной в течение всего срока службы. – Shahzeb
Возможный дубликат http://stackoverflow.com/questions/30936623/try-catch-finally-block-in-java?rq=1 – thanga