[WLS] Using try-with-resources with JDBC objects

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with

JDK7で導入された新しい言語構造(try-with-resource)があり、これをJDBCに適用します。チュートリアルは以下のリンクからどうぞ。
The try-with-resources Statement
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html.
不要になれば自動的にオブジェクトを閉じることができます。理論的には、オブジェクトはjava.lang.AutoCloseableを拡張している必要があります。JDK7の場合、そのリストには、java.sql.CallableStatement、Connection、PreparedStatement、Statement、ResultSet、*RowSetが含まれています。
Statement stmt = null;
try {
  stmt = con.createStatement();
} catch (Exception ignore) {
} finally {
  if (stmt != null) stmt.close()
}
becomes a shorter version using the new syntax

try (Statement stmt = con.createStatement()) {
} catch (Exception ignore) {
}
次のコードは、テスト用にWebLogicサーブレットに埋め込んだものです。セミコロンで区切られた最初のtry-with-resourceの中に2個のリソースがあることの注意して下さい。
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";
}
お好みのプログラミングパラダイムが何かわかりませんので、お好きな方でどうぞ。

Connection、Statement、ResultSetが閉じられたことはどうやってわかるのでしょう。JDBCSQLデバッギングをサーバー上でONにし、サーバーログ出力を見ることにします(これは裏で何が起こっているかを確認するのによいトリックかと)。以下は出力から余分な部分を省いたものです。
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
JDBC4.1準拠のドライバがそれほど出てないと思われるかもしれません。確かにそれは本当です(Oracle thin driverは12cでojdbc7.jarが出てくる予定です)。しかし、HotSpot JVMはAutoClosableの拡張を確認していないようです。これらのJDBCオブジェクトは初期の仕様からこの基準を満たしているので、オブジェクトにclose()メソッドがあればOKです。WebLogic Serverの10.3.6でがJDK 7のサポートを開始しました。WebLogic Serverと共に出荷しているすべてのドライバー、さらにいくつかのベンダーから出ているドライバーででテストし、このJDK 7の言語機能はJDBC 4.1以前のドライバでも正常に動作しています。

それゆえ、このプログラミングパラダイムがお好きなら、WebLogic Server 10.3.6以後で使い始めてください。

0 件のコメント:

コメントを投稿