2015-07-21 3 views
3

У меня есть класс, который использует блок инициализации static для настройки соединения с базой данных. Класс имеет много методов public static, которые запрашивают db. Я хотел бы правильно закрыть это соединение в блоке static, который выполняется непосредственно перед завершением программы, вроде как блок finally в try/catch. Я почти уверен, что что-то вроде этого не существует на Java. Является ли мой лучший способ открыть и закрыть соединение с каждым запросом?Статический блок finally в Java

+0

возможный дубликат [Как обеспечить кусок кода выполняется перед выходом из приложения Java] (HTTP: // StackOverflow .com/questions/13754263/how-to-sure-a-of-code-is-run-before-exiting-a-java-приложение) –

+0

Вам действительно нужно опубликовать код. Но, вообще говоря, статическая переменная соединения после инициализации останется доступной в течение всего срока службы. – Shahzeb

+0

Возможный дубликат http://stackoverflow.com/questions/30936623/try-catch-finally-block-in-java?rq=1 – thanga

ответ

3

Посмотрите на это: 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")); 
} 
+0

Вышеприведенный код работает нормально, когда приложение выходит из системы. Если виртуальная машина прерывается, то не может быть гарантирована, будут ли выполняться какие-либо выключения. – Sridhar

+0

Вопрос: ** Является ли мой лучший вариант открывать и закрывать соединение с каждым запросом? ** – mustangDC

+0

Если у вас слишком много запросов, не рекомендуется открывать и закрывать соединение с каждым запросом. Это увеличит ваши строки кода и вызовет ненужные накладные расходы. Использование shutDownHook может уменьшить все это. – Ridhima

1

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

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

ПРИМЕЧАНИЕ. Если JVM завершается до того, как основной поток завершит выполнение, то есть выполнит команду System.exit(), последующий код и блок finally не будут выполнены.

0

Является ли это лучшим вариантом для открытия и закрытия соединения с каждым запросом? 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

1
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------- 
} } 

Таким образом, вы открытое соединение за один раз и закрытия, когда процесс, наконец, закончил

Смежные вопросы