- PR -

コネクションは必ずクローズ?

投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-12-09 01:59
public static void main( String[] args ) {
 int sysExitCode = 0;
 Connection con = null;
 Statement stmt = null;
 try {
  Class.forName( "oracle.jdbc.driver.OracleDriver" );
  con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger" );
  stmt = con.createStatement();
 }
 catch( ClassNotFoundException e ) {
  e.printStackTrace();
  sysExitCode = 1;
 }
 catch( SQLException e ) {
  e.printStackTrace();
  sysExitCode = 1;
 }
 finally {
  if( null != stmt ) {
   try {
    stmt.close();
   }
   catch( SQLException e ) {
    e.printStackTrace();
    sysExitCode = 1;
   }
  }
  if( null != con ) {
   try {
    con.close();
   }
   catch( SQLException e ) {
    e.printStackTrace();
    sysExitCode = 1;
   }
  }
 }
 System.exit( sysExitCode );
}

こうなりました。

[ メッセージ編集済み 編集者: Orphan 編集日時 2007-12-09 02:36 ]

[ メッセージ編集済み 編集者: Orphan 編集日時 2007-12-09 03:14 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-12-09 11:36
べったりと書くならこんな感じかなぁ。
RuntimeExceptionの所は、必要に応じて自前の例外クラスにします。
close処理の所の例外は、つかまえても何もできないので無視してます。
コード:
try {
	Class.forName("ドライバクラス名");
} catch (ClassNotFoundException e) {
	throw new RuntimeException("もう駄目でしょ", e);
}

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try {
	conn = DriverManager.getConnection(....);
	stmt = conn.createStatement();
	rs = stmt.executeQuery(.....);
	// 色々
} catch (SQLException e) {
	throw new RuntimeException(e);
} finally {
	try {
		if (rs != null) rs.close();
	} catch (SQLException ignore) {}
	try {
		if (stmt != null) stmt.close();
	} catch (SQLException ignore) {}
	try {
		if (conn != null) conn.close();
	} catch (SQLException ignore) {}
}



んで、普通はメソッドに分割するかなぁ
こちらもRuntimeExceptionを使ってるけど、必要に応じて自前例外クラスにします。
コード:
public static void main(String[] args) {
	try {
		initializeDriver();
		executeProcess();
	} catch (RuntimeException e) {
		System.out.println("error");
	}
}

static void initializeDriver() {
	try {
		Class.forName("ドライバクラス名");
	} catch (ClassNotFoundException e) {
		throw new RuntimeException("もう駄目でしょ", e);
	}
}

static void executeProcess() {
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;

	try {
		conn = DriverManager.getConnection(....);
		stmt = conn.createStatement();
		rs = stmt.executeQuery(.....);
		// 色々
	} catch (SQLException e) {
		throw new RuntimeException(e);
	} finally {
		close(rs);
		close(stmt);
		close(conn);
	}
}

static void close(Connection conn) {
	try {
		if (conn != null) conn.close();
	} catch (SQLException ignore) {}
}
static void close(Statement stmt) {
	try {
		if (stmt != null) stmt.close();
	} catch (SQLException ignore) {}
}
static void close(ResultSet rs) {
	try {
		if (rs != null) rs.close();
	} catch (SQLException ignore) {}
}

スキルアップ/キャリアアップ(JOB@IT)