对JDBC对象使用try-with-resources

JDK7中引入了一种新的语言构造,该构造适用于JDBC。称为尝试资源。在http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html有一个教程。
它使您可以在不再需要对象时自动关闭它。从理论上讲,该对象必须扩展java.lang.AutoCloseable。在JDK7中,该列表包括java.sql.CallableStatementConnectionPreparedStatementStatementResultSet* RowSet。以下代码

Statement stmt = null;
try {
  stmt = con.createStatement();
} catch (Exception ignore) {
} finally {
  if (stmt != null) stmt.close()
}


使用新语法成为较短版本

try (Statement stmt = con.createStatement()) {
} catch (Exception ignore) {
}

这是我嵌入到WebLogic servlet中进行测试的一个更大的示例。请注意,第一个try-with-resource中有两个资源,以分号分隔。

private String doit() {
  String table2 = "test222";
  String dropsql = "drop table " + table2 + "";
  String createsql = "create table " + table2 + " ( col1 int, col2 int )";
  String insertsql = "insert into " + table2 + " values (1,2)";
  String selectsql = "select col1, col2 from " + table2 + "";
  try {
    ds = getDS();
  } catch(Exception e) {
    return("failed to get datasource");
  }
  try (Connection conn = ds.getConnection();
    Statement stmt = conn.createStatement())
{
    try {
       stmt.execute(dropsql);
   } catch (Exception ignore) {} // ignore if table not dropped
   stmt.execute(createsql);
   stmt.execute(insertsql);
   try (ResultSet rs = stmt.executeQuery(selectsql)) {
     rs.next();
   } catch (Exception e2) {
     e2.printStackTrace();
     return("failed");
   }
 } catch(Exception e) {
   e.printStackTrace();
   return("failed");
 }
 return "DONE";
}

我不确定我是否喜欢编程范例-您可以自己决定。

我怎么知道连接,语句和结果集被关闭?我可以在服务器中打开JDBCSQL调试,并查看服务器日志输出(这是一个很好的技巧,可用来了解幕后情况)。这是输出的精简版本。

 Connection@1 CreateStatement() 

 Connection@1 CreateStatement returns StatementWrapper@2 

 StatementWrapper@2 execute(drop table test222) 

 StatementWrapper@2 execute(drop table test222) throws java.sql.SQLSyntaxErrorException: table or view does not exist

 StatementWrapper@2 execute(create table test222 ( col1 int, col2 int )) 

 StatementWrapper@2 execute returns false 

 StatementWrapper@2 execute(insert into test222 values (1,2)) 

 StatementWrapper@2 execute returns false 

 StatementWrapper@2 executeQuery(select col1, col2 from test222) 

 StatementWrapper@2 executeQuery returns ResultSetImpl@3 

 ResultSetImpl@3 next() 

 ResultSetImpl@3 next returns true 

 ResultSetImpl@3 close() 

 ResultSetImpl@3 close returns 

 StatementWrapper@2 close() 

 StatementWrapper@2 close returns 

 Connection@1 close() 

 Connection@1 close returns

 

您可能会认为那里没有很多兼容JDBC 4.1的驱动程序,这是真的(Oracle瘦驱动程序在发行时版本12c中将具有ojdbc7.jar)。但是,像java.sql.Statement这样的对象实现了AutoClosable,因此在JDK7上运行时,驱动程序Statement也被假定为实现AutoClosable。该对象仅需要具有close()方法,因此自初始规范以来,所有这些JDBC对象均符合条件。WebLogic Server在版本10.3.6中开始支持JDK7。对WebLogic Server附带的所有驱动程序以及各种供应商的一些驱动程序进行的测试表明,此JDK7语言功能与JDBC 4.1之前的驱动程序配合得很好。 

请注意,此技巧不适用于新的JDK7方法-您将收到AbstractMethodError

因此,如果您喜欢这种编程范例,请立即在WebLogic Server 10.3.6或更高版本中使用它。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值