在java中尝试使用资源Statement for JDBC

时间:2016-02-01 12:21:07

标签: java exception-handling try-catch

Hive JDBC的有用代码:

       Connection con = null;
       Statement stmt = null

        try {
            Class.forName("org.apache.hive.jdbc.HiveDriver");
            con = DriverManager.getConnection(connectionUri, userName, password);
            stmt = con.createStatement();
            stmt.executeUpdate(query);

        } catch (ClassNotFoundException cex) {
            cex.printStackTrace();

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

我想删除 finally 块中的try-catch。

所以我尝试了The try-with-resources Statement

        try (Class.forName("org.apache.hive.jdbc.HiveDriver");
            Connection con = DriverManager.getConnection(connectionUri, userName, password);
            Statement stmt = con.createStatement();){

            stmt.executeUpdate(query);

        } catch (ClassNotFoundException cex) {
            cex.printStackTrace();

        } catch (SQLException e) {
            e.printStackTrace();
        } 

我认为这不是正确的方法。

Class.forName("org.apache.hive.jdbc.HiveDriver")不应该尝试。我应该为此单独设置一个try-catch吗?

       try {
            Class.forName("org.apache.hive.jdbc.HiveDriver");

        } catch (ClassNotFoundException cex) {
            cex.printStackTrace();
        }
        try (Connection con = DriverManager.getConnection(connectionUri, userName, password);
            Statement stmt = con.createStatement();){

            stmt.executeUpdate(query);

        } catch (SQLException e) {
            e.printStackTrace();
        } 

这是正确的方式还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

try-with-ressource背后的想法是关闭AutoCloseable类。 因此,在使用它之后应该关闭的类的每个用法(Ressource)都可以与try-with-ressource一起使用(例如Connection)。您不必手动关闭它(例如在finally块中)。

是的,你的想法是正确的:

  • 尝试/捕获Class.forName("org.apache.hive.jdbc.HiveDriver"); - 因为这不是AutoCloseable
  • Connection con = DriverManager.getConnection(connectionUri, userName, password); Statement stmt = con.createStatement();的try-with-ressource - 因为ConnectionStatement实现了AutoCloseable

参考: https://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html

答案 1 :(得分:2)

当您使用Java 6或更高版本且Apache Hive JDBC驱动程序符合JDBC 4或更好*时,您根本不需要Class.forName("org.apache.hive.jdbc.HiveDriver")内容。

因此,您可以从第二个解决方案中删除整个try / catch块,并且只需使用它就可以了:

try (Connection con = DriverManager.getConnection(connectionUri, userName, password);
     Statement stmt = con.createStatement()) {

    stmt.executeUpdate(query);

} catch (SQLException e) {
    e.printStackTrace();
} 

*版本1.2.0或更新的Hive JDBC驱动程序

的情况如此