Java中的静态块

Java中的静态块,java,Java,我有一个类,它使用静态初始化块来建立到数据库的连接。该类有许多查询数据库的公共静态方法。我想在程序终止前执行的静态块中正确关闭此连接,有点像try/catch中的finally块。我几乎可以肯定Java中不存在这样的东西。打开和关闭每个查询的连接的最佳选项是什么?请查看以下内容: 您可以尝试编写代码来关闭此方法中的连接 public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thr

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

请查看以下内容:

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

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

打开和关闭每个查询的连接将导致系统额外的开销,使应用程序运行缓慢

您可以用try-catch块代替DB程序的最终查询,并释放finally子句中的连接(用于程序的最后一次查询)


注意:如果JVM在主线程完成执行之前终止,即System.exit()执行,则后续代码和finally块将不会执行。我打开和关闭与每个查询的连接的最佳选项是什么? 回答:没有

我建议你遵循:

Singleton类
用于打开连接,如下所示:

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;
}
}
就打电话
conn=connectDB.getConnection()
用于连接,另一个用于关闭,最好在
最后一个

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

通过这种方式,您可以打开连接一次,并在过程最终完成时关闭连接

您需要发布代码的可能副本。但一般来说,静态连接变量一旦初始化,在应用程序的整个生命周期内都将保持可用。可能是关机挂钩的重复。只有通过关机挂钩,您才“可能”知道JVM何时关机,但是,这假设正常关机已经发生。一般来说,更好的解决方案可能是根据需要创建
连接的短期实例,并在完成后关闭它们,或者使用某种类型的连接池。当应用程序正常退出时,上述代码可以正常工作。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。问题是我打开和关闭每个查询的连接的最佳选择是什么?如果查询太多,则打开和关闭每个查询的连接并不好。它会增加您的代码行,并导致不必要的开销。使用shutDownHook可以减少这一切。。
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-------
} }