https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with
JDK7で導入された新しい言語構造(try-with-resource)があり、これをJDBCに適用します。チュートリアルは以下のリンクからどうぞ。
The try-with-resources Statement不要になれば自動的にオブジェクトを閉じることができます。理論的には、オブジェクトはjava.lang.AutoCloseableを拡張している必要があります。JDK7の場合、そのリストには、java.sql.CallableStatement、Connection、PreparedStatement、Statement、ResultSet、*RowSetが含まれています。
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html.
次のコードは、テスト用にWebLogicサーブレットに埋め込んだものです。セミコロンで区切られた最初のtry-with-resourceの中に2個のリソースがあることの注意して下さい。
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) {
}
お好みのプログラミングパラダイムが何かわかりませんので、お好きな方でどうぞ。
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にし、サーバーログ出力を見ることにします(これは裏で何が起こっているかを確認するのによいトリックかと)。以下は出力から余分な部分を省いたものです。
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以前のドライバでも正常に動作しています。
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
それゆえ、このプログラミングパラダイムがお好きなら、WebLogic Server 10.3.6以後で使い始めてください。
0 件のコメント:
コメントを投稿