在 java 中尝试使用 JDBC 的资源语句

Posted

技术标签:

【中文标题】在 java 中尝试使用 JDBC 的资源语句【英文标题】:Try with resources Statement for JDBC in java 【发布时间】:2016-02-01 12:21:07 【问题描述】:

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();
         

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

【问题讨论】:

【参考方案1】:

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

所以是的,你的想法是对的:

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

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

【讨论】:

【参考方案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 驱动程序就是这种情况

【讨论】:

这是为什么呢? Java不应该还必须实例化驱动程序吗?我正在使用 jtds 驱动程序并注意到同样的事情,当我忘记实例化它时,程序仍然正常运行。 @jabeoogie,这是在Why we use Class.forName(“oracle.jdbc.driver.OracleDriver”) while connecting to a DataBase?回答的

以上是关于在 java 中尝试使用 JDBC 的资源语句的主要内容,如果未能解决你的问题,请参考以下文章

Java JDBC - 浏览数据库中的记录

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

列表返回的 JAVA JDBC 问题

使用 JDBC 准备语句插入时出错

oracle Jdbc 更新语句返回零

使用 JDBC 插入 PostgreSQL 时间类型时出错