- PR -

Javaのデストラクタとデータベースのクローズ処理について

1
投稿者投稿内容
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-06-14 14:31
JDBC-ODBCブリッジを使ったプログラムを作っているのですが、SQLを使用する部分をクラス分けすることにしました。

コンストラクタでデータベースのオープン処理を行い、メソッドで挿入・取得を行うように設計しました。
データベースのクローズ処理をデストラクタの部分で行おうと思っているのですが、"Javaにはガベージコレクションがあるから、デストラクタは使わない"ということがそこらに書いてあります。

データベースのクローズ処理を行わずにクラスを終了しても、正常に終了してくれるのでしょうか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-06-14 14:52
Javaにはデストラクタはありません。よく似たファイナライザというものがあります。
インスタンスへの参照がなくなり、GCされるタイミングで呼ばれるfinalizeメソッドです。

クローズ処理がコネクションオブジェクトのfinalizeメソッドの中で明示的に行われていれば、
物理的なセッションは解放されるかもしれません。しかし、

・いつ解放されるかわからない
・ドライバによっては解放されるとは限らない
・そもそもコネクションオブジェクトのクローズメソッドが解放を行うとは限らない
  (代わりにコネクションプールへの返却を行う)

というような理由から、明示的にクローズを行うべきです。
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-06-14 15:15
なるほど、わかりました。

それでは、データベースがオープンされているかチェックした後にクローズ処理を行うメソッドを作成して実行させたいと思います。

かつのりさん、ありがとうございました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-06-14 16:23
引用:

それでは、データベースがオープンされているかチェックした後にクローズ処理を行うメソッドを作成して実行させたいと思います。


誰がいつコネクションをオープンするかわからないのでしょうか?
(接続を使いまわす等・・・)
コネクションインスタンスのライフサイクルが管理できないような設計はやめましょう。

取得、破棄を一連の流れで行い、オープンされていない状態でのクローズは例外とすべきです。
予期しないクローズ、接続の使いまわしを検出できなくなりますよ。
1

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