在 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();
- 因为 Connection
和 Statement
实现 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.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭