【问题标题】:Static finally block in JavaJava中的静态finally块
【发布时间】:2015-07-21 04:59:27
【问题描述】:

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

【问题讨论】:

标签: java


【解决方案1】:

看看这个: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"));
}

【讨论】:

  • 上述代码在应用程序正常退出时工作正常。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
  • 问题是我最好的选择是打开和关闭每个查询的连接吗?
  • 如果查询太多,每次查询都打开和关闭连接不好。它会增加您的代码行数并导致不必要的开销。使用shutDownHook 可以减少所有这些..
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
    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-------
    } }
    

    这样你打开一次连接,当进程最终完成时关闭

    【讨论】:

      【解决方案4】:

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

      我建议你关注:

      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

      【讨论】:

        猜你喜欢
        • 2015-09-05
        • 1970-01-01
        • 2010-09-08
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多