静态最终在Java中阻塞

时间:2015-07-21 04:59:28

标签: java

我有一个使用static初始化块来建立与数据库的连接的类。该类有许多查询db的public static方法。我想在程序终止之前执行的static块中正确关闭此连接,有点像finally中的try/catch块。我几乎可以肯定Java中不存在这样的东西。我是打开和关闭每个查询连接的最佳选择吗?

4 个答案:

答案 0 :(得分:3)

看看这个:{{3}}

您可以尝试编写代码来关闭此方法中的连接。

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            //code to close connection
        }
    }, "Shutdown-thread"));
}

答案 1 :(得分:1)

为每个查询打开和关闭连接将导致系统上的额外开销,使应用程序变慢。

您可以使用try catch块来包围数据库程序的最终查询,并在finally子句中释放连接(用于程序的最后一次查询)。

注意:如果JVM在主线程完成执行之前终止,即执行System.exit(),则后续代码和finally块将不会被执行。

答案 2 :(得分:1)

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

这样您可以打开一次连接,并在进程最终完成时关闭

答案 3 :(得分:0)

打开和关闭每个查询的连接是我的最佳选择吗? 答:没有

我建议你关注:

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()用于连接,另一个用于关闭,最好在finally