【Java】try-with-resourcesでJDBCのリソースを自動的にクローズする方法
JDBCではtry-with-resources(try-with-resourcesステートメント)を使用することで、ConnectionやStatementなどのリソースを自動的にクローズできます。close()メソッドを明示的に呼び出す必要がなく、閉じ忘れによるリソースリークを防げるため、より安全で簡潔なコードを書くことができます。
基本構文
try(リソースの宣言){
処理内容...
} catch (SQLException e) {
e.printStackTrace();
}
try-with-resourcesとは、tryキーワードの直後に1つ以上のリソースを宣言する特別なtry文のことです。ここでいう「リソース」とは、使用が終わったら必ずクローズすべきオブジェクトを指します。
この構文では複数のリソースを同時に宣言することも可能で、宣言されたすべてのリソースはステートメントの終了時に自動的にクローズされます。
なお、try-with-resourcesで宣言できるのは、java.lang.AutoCloseableインターフェースまたはjava.io.Closeableインターフェースを実装した(あるいはjava.lang.AutoCloseableを継承した)クラスのオブジェクトに限られます。
JDBCにおいては、java.sql.CallableStatement、Connection、PreparedStatement、Statement、ResultSet、そしてRowSetなどのオブジェクトをtry-with-resourcesステートメントで扱うことができます。
実行例
まず、次のCREATE文を使用して、MySQLデータベースに「MyPlayers」という名前のテーブルを作成します。
CREATE TABLE MyPlayers( ID INT, First_Name VARCHAR(255), Last_Name VARCHAR(255), Date_Of_Birth date, Place_Of_Birth VARCHAR(255), Country VARCHAR(255), PRIMARY KEY (ID) );
次に、INSERT文を使ってMyPlayersテーブルに7件のレコードを挿入します。
insert into MyPlayers values(1, 'Shikhar', 'Dhawan', DATE('1981-12-05'), 'Delhi', 'India');
insert into MyPlayers values(2, 'Jonathan', 'Trott', DATE('1981-04-22'), 'CapeTown', 'SouthAfrica');
insert into MyPlayers values(3, 'Kumara', 'Sangakkara', DATE('1977-10-27'), 'Matale', 'Srilanka');
insert into MyPlayers values(4, 'Virat', 'Kohli', DATE('1988-11-05'), 'Delhi', 'India');
insert into MyPlayers values(5, 'Rohit', 'Sharma', DATE('1987-04-30'), 'Nagpur', 'India');
insert into MyPlayers values(6, 'Ravindra', 'Jadeja', DATE('1988-12-06'), 'Nagpur', 'India');
insert into MyPlayers values(7, 'James', 'Anderson', DATE('1982-06-30'), 'Burnley', 'England');
以下のJDBCプログラムは、JDBCにおけるtry-with-resourcesステートメントの実際の使い方を示したサンプルです。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TryWithResources_Example {
public static void main(String args[]) {
// 接続の取得
String mysqlUrl = "jdbc:mysql://localhost/mydatabase";
System.out.println("Connection established......");
// ConnectionとStatementをtry-with-resourcesで宣言(自動クローズ対象)
try(Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
Statement stmt = con.createStatement(); ) {
try(ResultSet rs = stmt.executeQuery("select * from MyPlayers");) {
// データの取得
while(rs.next()) {
System.out.print(rs.getInt("ID")+", ");
System.out.print(rs.getString("First_Name")+", ");
System.out.print(rs.getString("Last_Name")+", ");
System.out.print(rs.getDate("Date_Of_Birth")+", ");
System.out.print(rs.getString("Place_Of_Birth")+", ");
System.out.print(rs.getString("Country"));
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
実行結果
Connection established...... 1, Shikhar, Dhawan, 1981-12-05, Delhi, India 2, Jonathan, Trott, 1981-04-22, CapeTown, SouthAfrica 3, Kumara, Sangakkara, 1977-10-27, Matale, Srilanka 4, Virat, Kohli, 1988-11-05, Delhi, India 5, Rohit, Sharma, 1987-04-30, Nagpur, India 6, Ravindra, Jadeja, 1988-12-06, Nagpur, India 7, James, Anderson, 1982-06-30, Burnley, England
このようにtry-with-resourcesを使用すると、tryブロックを抜けた時点でConnection、Statement、ResultSetが宣言された逆順に自動的にクローズされます。finallyブロックでclose()を呼び出す従来の書き方と比べてコードが大幅に簡潔になり、例外が発生した場合でも確実にリソースが解放されるため、JDBCプログラミングでは積極的に活用したい構文です。
-
【Java】Selenium WebDriverで子ブラウザウィンドウを閉じる方法をわかりやすく解説
Selenium WebDriverでテストを自動化していると、リンクやボタンのクリックをきっかけに新しいブラウザウィンドウ(子ウィンドウ)が開くケースがよくあります。本記事では、Javaを使用して子ブラウザウィンドウを閉じ、親ウィンドウへ制御を戻す方法を具体的なコード例とともに解説します。ウィンドウハンドルの基本子ウィンドウの操作にはgetWindowHandlesメソッドとgetWindowHandleメソッドを使用します。getWindowHandlesメソッドは、現在開いているすべてのウィンドウのハンドルをSetデータ構造に格納して取得するために使われます。一方、getWindowHa
-
JavaでJSONをパース(解析)する方法|org.json・Gson・JsonPathの使い方を解説
このチュートリアルでは、JavaでJSONを解析(パース)する方法を、複数のライブラリの使い方とあわせて解説します。 JSONとは「JavaScript Object Notation」の略称で、JavaScriptのサブセットをベースとした軽量なデータ形式です。 データ交換フォーマットとして広く普及しており、Webプログラミングにおいて不可欠な技術となっています。本記事では、org.jsonライブラリを使ったJSONのパース方法を中心に紹介します。 まず基本をおさらいしましょう。JSONオブジェクトは「キーと値のペア」から構成される順序のない集合です。一方、JSON配列は値が順序付けて格納さ