こんにちは。

少し質問なんですが、jdbcを使用してDBとデータのやり取りが終わった後に
StatementとResultSetをクローズしないでConnectionだけをクローズすると
どうなりますか?
StatementとResultSetもガーベージコレクションによりクローズされるのでしょうか?

少し気になったので、どなたか教えてください。
よろしくお願いします。

A 回答 (1件)

Statement#close()およびResultSet#close()をやらないのは非常にお行儀が


悪いので絶対やりましょう。他の人が見たときに「なんでcloseしないの?」
と疑問に思うことでしょう。
あとループでぐりぐりまわしつつ処理した時などに「最大カーソル数を越えました」
というエラーが出ることがありますから絶対closeした方がいいです。

ちなみにDBに関係するリソースはいらなくなったらすぐcloseした方が安全のようです。
プログラム側だけでなくDB側のリソースも解放することで無用なトラブルを減らすと
ある本に書いてありました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QConnection、ResultSet、、Statementのclose処理について

Connection、ResultSet、Statementのclose処理について、
何となくは行わないといけない、ということはわかるのですが、
それがどうしてなのかがイメージとしてしっかりと具体化できませんでした。

これらのclose処理は一体どうして、行わないといけないのでしょうか?(必須ではないみたいですが、行った方がよい様子でしたので)
データベースつなぎっぱなしの「connectionが繋がったまま」という状況がダメだというのは何となく「ああ、そうなんだ」と思えるはしますが・・・ それでも「何がどうなるからダメであるのか」がいまいち、ボヤけている状態です。

【参考URL】
http://www.atmarkit.co.jp/fjava/rensai2/jspservlet10/jspsevlet10_1.html

「 ■データベースや結果セットは明示的にクローズすべきか 」

より、内容をみてみたところ

>不要なリソースをいつまでもメモリ上に残すということは、限りあるサーバリソースを浪費するという意味でも好ましいことではありません。

ともありましたが、
ここの「限りあるサーバーリソースを浪費する」というのは、
サーバー上にある「数少ないメモリ領域を、ResultSetなり、Statementなりが占領してしまう」ことにより、他のプログラムを動かせなくなってしまうから、ということなのでしょうか?

Connection、ResultSet、Statementのclose処理について、
何となくは行わないといけない、ということはわかるのですが、
それがどうしてなのかがイメージとしてしっかりと具体化できませんでした。

これらのclose処理は一体どうして、行わないといけないのでしょうか?(必須ではないみたいですが、行った方がよい様子でしたので)
データベースつなぎっぱなしの「connectionが繋がったまま」という状況がダメだというのは何となく「ああ、そうなんだ」と思えるはしますが・・・ それでも「何がどうなるか...続きを読む

Aベストアンサー

メモリもそうですが、データベースに対するコネクションも使っているので場合によっては、データベースに接続できないプログラムも出てきたりします。

それが、処理の優先順位の高いプログラムだったりすると怒られるだけじゃすまないこともあります。

なので、必要の無いものはクローズするべきだと思います。

QDB2のJDBCを使用したDBコネクションの取得方法の違い

WebSphereとDB2を使用してDB2へアクセスしてテーブルからデータの取得をしたいと思っています。
このとき、DB2のJDBCを使用しますが、getConnectionでコネクションを取得するときに指定するDBのURLに、複数の指定方法があるようです。

その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名

その1の方法ではコネクションを取得できたのですが、その2の方法では失敗しました。

ホストIPには自分のマシンのIPを、ポート番号にはDB2をインストールしたときに設定した番号を指定しました。

この両者の違いをご存知の方は教えてください。
また、その2の方法でなぜ失敗したのか、見当がつく方がいたらこちらも教えていただきたいと思います。

なお、実行環境は以下の通りです。

CPU ペンティアム3 800Mhz
メモリ 512MByte
OS Windows2000 SP2
ブラウザ IE5.5 SP2
AS Websphere 4.0
DB DB2 7.2

※WebshpereとDB2は同一マシンにインストールされています。

WebSphereとDB2を使用してDB2へアクセスしてテーブルからデータの取得をしたいと思っています。
このとき、DB2のJDBCを使用しますが、getConnectionでコネクションを取得するときに指定するDBのURLに、複数の指定方法があるようです。

その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名

その1の方法ではコネクションを取得できたのですが、その2の方法では失敗しました。

ホストIPには自分のマシンのIPを、ポート番号にはDB2をインストールしたときに設定...続きを読む

Aベストアンサー

まず、
その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名
の違いですが、
「その1」の方はJava実行マシンとDB2サーバが同じホスト上にある場合(Type2のJDBCドライバ用?)に使うようです。
それに対して、「その2」は、ホスト名とポート番号を指定していることからわかるように、Java実行マシンとDB2サーバが別々のホスト上にある場合(Type4のJDBCドライバ用?)に使うようです。

で、なんで「その2」で接続ができないのかという原因ですが、
(1)サーバー側の設定が足りない
(2)ドライバ名が違う
の2つが考えられます。

(1)の方は、サーバー側で「このポート番号でJDBC接続を待ち受けます」という設定を行う必要があります。これは、"db2jstrt <ポート番号>"というコマンドをサーバー上で実行することで、設定できます。
(2)の方は、"COM.ibm.db2.jdbc.net.DB2Driver"というJDBCドライバを使っているか確認してください。"COM.ibm.db2.jdbc.app.DB2Driver"ではありません。こっちだと、「その1」の方の接続方法しかサポートしていないような気がします。(よく調べていないのでわかりませんが)

以上2点を確認してみては?

まず、
その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名
の違いですが、
「その1」の方はJava実行マシンとDB2サーバが同じホスト上にある場合(Type2のJDBCドライバ用?)に使うようです。
それに対して、「その2」は、ホスト名とポート番号を指定していることからわかるように、Java実行マシンとDB2サーバが別々のホスト上にある場合(Type4のJDBCドライバ用?)に使うようです。

で、なんで「その2」で接続ができないのかという原因ですが、
(1)サーバー...続きを読む

Qガーベージコレクション?

Javaにガーベージコレクションってあるじゃん。重要そうなのですが、私の理解はイマイチです。ガーベージコレクションって何ですか?一言で言えば、ごみインスタンスなのかな。

以下は私独学の推測
インスタンスを作るとき、new Constructor();ってやるじゃん。だけど、これだけだとガーベージコレクションになって、そのうち自動的にインスタンスが消えるのかな?

インスタンスを残そうとすると、左辺が重要である。
◯ City tokyo=new City();(左辺=右辺;の形)
× new City();(右辺;の形で、左辺=を省略している)

恒久的インスタンスにしようとすると、左辺で変数のクラス型と変数名を指定して、右辺の受け皿(代入先)を用意する。City型のインスタンスを作るだけなら、左辺を省略してnew City();だけで十分。しかし、これだとガーベージコレクションになって、すぐ消える。

正しい?

Aベストアンサー

ガベージコレクションは、メモリ管理機能です。
プログラム上で使用しなくなったオブジェクト(インスタン
ス)を探して、メモリ上から削除するという動作をします。


例えば、
 City tokyo=new City();
 tokyo = null;
というコードを書いた場合、tokyo = null; の実行後は City
オブジェクトは使われません(使えません)。このようなオブ
ジェクトはガベージコレクションが自動的に判別してメモリ
上から削除します。


また、例えば
if (hoge == 0) {
 City tokyo=new City();
}
というコードを書いた場合、if 文のスコープを抜けた後では
City オブジェクトは使われません(使えません)。このような
オブジェクトはガベージコレクションが自動的に判別してメ
モリ上から削除します。


このように、スコープを外れたり参照変数に null を突っ込ま
れたりして、どこからも参照されなくなった(使われなくなっ
た)オブジェクトを自動的に探してメモリ上から削除する機能
がガベージコレクションです。

※注意点として、ガベージコレクションは『オブジェクトが使
 われなくなったら即消す』ということはしません。JAVA の
 好きなタイミングで消します。

ガベージコレクションは、メモリ管理機能です。
プログラム上で使用しなくなったオブジェクト(インスタン
ス)を探して、メモリ上から削除するという動作をします。


例えば、
 City tokyo=new City();
 tokyo = null;
というコードを書いた場合、tokyo = null; の実行後は City
オブジェクトは使われません(使えません)。このようなオブ
ジェクトはガベージコレクションが自動的に判別してメモリ
上から削除します。


また、例えば
if (hoge == 0) {
 City tokyo=new City();
}
というコードを書いた場合、if...続きを読む

QJDBC Connectionを開放し続ける方法

JDBC経由でOracleに接続して、接続しっぱなしにしたいのですが、どうすればいいのかよくわかりません。
とりあえず正常終了するようなソースを書いてみました。このソースからconnectionをCloseしないように編集したいのですが、どうすればいいのかわかりません。
やりたいことはJDBCの複数同時Connectionを試したくて、このConnectionを維持したまま、何回かこのプログラムを実行すればいいかなと思っているんですが。
長くなりましたが、よろしくお願いします。

import java.sql.*;

class Employee
{
public static void main (String args [])
throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

// Connect to the database
// You must put a database name after the @ sign in the connection URL.
// You can use either the fully specified SQL*net syntax or a short cut
// syntax as <host>:<port>:<sid>. The example uses the short cut syntax.
Connection conn =
DriverManager.getConnection ("jdbc:oracle:thin:@HOST:PORT:SID",
"scott", "tiger");

// Create a Statement
Statement stmt = conn.createStatement ();

// Select the ENAME column from the EMP table
ResultSet rset = stmt.executeQuery ("select ENAME from EMP");

// Iterate through the result and print the employee names
while (rset.next ())
System.out.println (rset.getString (1));
}
}

JDBC経由でOracleに接続して、接続しっぱなしにしたいのですが、どうすればいいのかよくわかりません。
とりあえず正常終了するようなソースを書いてみました。このソースからconnectionをCloseしないように編集したいのですが、どうすればいいのかわかりません。
やりたいことはJDBCの複数同時Connectionを試したくて、このConnectionを維持したまま、何回かこのプログラムを実行すればいいかなと思っているんですが。
長くなりましたが、よろしくお願いします。

import java.sql.*;

class Employee
{
...続きを読む

Aベストアンサー

Connection#finally()が走ったりプログラムが終了すると
クローズされてしまいます。

コネクションのインスタンスを保持するようにしましょう。
簡単な改修は、以下のようなものです。
いくつコネクションを保持するかはループ回数で
調整してください。

public static void main (String args []) {
List conList = new ArrayList();

for (int i = 0; i < 10; i++) {
// もともとのロジックの内容
conList.add(conn); // Connectionのインスタンスを保持
}
}

QresultsetによるDBへのレコード追加

できるかできないかだけでも教えてください。
お願いいたします。

ACCESSへレコードの追加を
Resultsetによってしたいと思います。

環境1
WIN2000(SP2) Forte3.0 JDK1.4 ACCESS2000
 では、以下のプログラムが一部(rs.moveToCurrentRow())を除き動きます。

環境2(ハードウェアの状態よりバージョンがあげられません)
win98(SP2?) Forte2 JDK1.3 ACCESS2000
 では、
  rs.insertRow()
 で例外が発生します。

ODBCドライバのバージョンは両環境とも.6019です。
JDBCドライバのバージョンがこの原因と思われますが、
JDBCドライバあげる方法もわかりませんし、手の打ちようがありません。
環境2で insertRow の動作の仕方など
ご存知の方ぜひ教えてください。

ソース
try{
String drv = "sun.jdbc.odbc.JdbcOdbcDriver";
String url = "jdbc:odbc:データベース名";
String usr = "";
String pw = "";
Connection con;
Statement st;

//接続
Class.forName(drv);
con = DriverManager.getConnection(url, usr, pw);
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                ResultSet.CONCUR_UPDATABLE);

  String qry="SELECT * FROM T_table";
ResultSet rs = st.executeQuery(qry);
rs.moveToInsertRow();

//データ入力
rs.updateString(1,"データ");
  //省略

//insertRowが動かない
rs.insertRow();

rs.moveToCurrentRow();
con.commit();

}catch(Exception e){
// System.exit(0);
}
}

できるかできないかだけでも教えてください。
お願いいたします。

ACCESSへレコードの追加を
Resultsetによってしたいと思います。

環境1
WIN2000(SP2) Forte3.0 JDK1.4 ACCESS2000
 では、以下のプログラムが一部(rs.moveToCurrentRow())を除き動きます。

環境2(ハードウェアの状態よりバージョンがあげられません)
win98(SP2?) Forte2 JDK1.3 ACCESS2000
 では、
  rs.insertRow()
 で例外が発生します。

ODBCドライバのバージョンは両環境とも.6019です。
JDBCドライバの...続きを読む

Aベストアンサー

あっ。追加です。

せっかくtryでくくってるのだから、

}catch(Exception e){
   //System.exit(0);
}finally{
   //クローズ処理
}

という風にしたほうが美しいですかね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報