こんにちは。

少し質問なんですが、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と関連する良く見られている質問

Qin par with の意味

Ford has hired RDA Group, market research firm based in Bloomfield Hills to find out how Ford vehicles fared with other brands in terms of quality. The result shows that Ford’s quality is in par with that of Toyota and Nissan.


In par with とはどういった意味ですか?
「この結果は、フォードの質がトヨタや日産並みだということを示している。」という解釈であっていますか?

Aベストアンサー

そういう解釈でいいと思いますよ。

もっとも、par の場合は、on a par with または on par with が普通だと思いますが。

筆者はひょっとすると in parallel with と混同しているのかもしれません。(それとも現在ではたとえ誤用でも in par with が口語などで普通に使われているのでしょうか? そこまでは私は不案内です)

いずれにせよ、この文章では意味的に「~と肩を並べる、同等である」で間違いないでしょう。

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ベストアンサー

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

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

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

QAs a result と in conslusion の違い

As a result と in conclusion の違いを、例文交えて教えてください。

As a result of the study ~等はよく聞きますが、逆にin conclusion of the study はあまり聞きません。
どういう時にどちらを使うのか、明確にしたいです。
よろしくお願い致します。

Aベストアンサー

※※※
michan_chappieさんの質問が、結構ハイレベルなので、私もちょっとハイレベル!な回答してみます (^_^ )
他の勉強もできてて、さらにハイレベルを目指すときに、下のこと、してみてくださいね。
※※※

ーーーーー


この2つがごっちゃになってしまうのって、結局、
result と conclude(conclusion)という、英語では全く別の単語なのに、日本語にすると「結果として」「結論として」と、似た感じの言葉になってしまうからだと思うんですね。


そういうときは、思い切って、「英英辞典」を使ってみるのが、
早道です!

ということで、調べてみました。

<result>
(意味) something that happens or exists because of something that happened before

<as a result (of something)>
(意味) →resultを参照
(例文) As a result of the pilots' strike, all flights have had to be cancelled.

<in conclusion>
(意味) used (in a piece of writing or a speech) to show that you are about to finish what you are saying
(例文) In conclusion, I would like to say how much I have enjoyed myself today.

<conclusion(参考)>
(意味) something you decide after considering all the information you have
(例文) These are the report's main conclusions.


ということは、
「as a result」は、「あることがあって、そこから論理直接的に、あるいは必然的に、○○である」という場合に使うということになります。
「in conclusion」は、「いろいろ言ってきたけど、最後に」というような場合に使い、conclusion自体の意味を含めて考えると、「(なんらか個別から直接的に示される結果ということではなく、)いろいろな情報を検討し、(あえて)まとめると」といような意味となる、ということです。


例文で言うと、

●As a result of the pilots' strike, all flights have had to be cancelled.
パイロットがストライキ→飛行機が飛ばない、は、直接つながるので、as a resultが使われている。
しかしこれが、「○○飛行場のパイロットがストをしようとしていたから、他の飛行場のパイロットを呼び寄せ、ストをしないはずの管理職にパイロット業務をしてもらうよう調整し、他会社にもパイロットをできる限り手配しようとした。また、パイロット達にストをしないよういろいろ交渉した。しかし、結果として、(ストは決行され、)飛行機は飛ばなかった。」なら、in conclusionが使われるでしょう。
両文とも日本語では「結果として」といえますが、英文では、使い分けられることになります。

●「In conclusion, I would like to say how much I have enjoyed myself today.」
これ、「結果として」「結論として」のどちらの日本語も不自然ですよね。
通常「最後に」と訳しますが、これ、上の説明を日本語で書こうとすると、「最後に」となるんですね。

ちなみに、
●「in conclusion of the study,」という表現は、
研究(study)の全体からいえることを、(エッセンスを抽出して)まとめると、結論として○○となる、ということなんでしょう。

ーーーーー

※参考※
・「英英辞典」は、Longman Dictionary of Contemporari Englisyがおすすめです(最新=6版)。
極力簡単なわかりやすい英語で書かれているのに、記載は十分です。
http://www.ldoceonline.com/ で、オンラインで調べられます。
・英英辞典を使うと、特に例文を読むと、ニュアンスとかもよくわかり、自然な英文を書けるようになり、
英語力は格段によくなること、お墨付きです!(できれば紙版を)


勉強たいへんと思いますが、がんばってくださいね! (^_^ )

※※※
michan_chappieさんの質問が、結構ハイレベルなので、私もちょっとハイレベル!な回答してみます (^_^ )
他の勉強もできてて、さらにハイレベルを目指すときに、下のこと、してみてくださいね。
※※※

ーーーーー


この2つがごっちゃになってしまうのって、結局、
result と conclude(conclusion)という、英語では全く別の単語なのに、日本語にすると「結果として」「結論として」と、似た感じの言葉になってしまうからだと思うんですね。


そういうときは、思い切って、「英英辞典」を使ってみるのが、
早...続きを読む

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)サーバー...続きを読む

Qresulting in~

The driver's carelessness resulted in the death of a pedestrian.
運転者の不注意で一人死ぬ結果となった。(運転手の不注意で通行人が一人死んだ)
この文は、このように訳せばいいと思うのですが、
He hit his shin on the chair resulting in a big bump.
この文はどのように訳せばいいのでしょうか?
resultingの前で一回区切って、「その結果こぶができた」としていいのですか?そもそもなぜresultingというようにing形になっているのか分かりません。

Aベストアンサー

No1 さんのご説明のとおりだと思います。
このタイプの間違いは北米の大学生のあいだでもよくあるらしく(彼らは文法を考えずに感覚で書きますので)、学内で専門のライティングクリニックがあったりして、Is your sentense dangling ? などとクリニックのポスターには書かれています。ちなみに有名大学での話です。

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...続きを読む

Qこの場合の「in place」の意味を教えてください

北朝鮮のバンコデルタの口座凍結の話なんですが、以下の一つ目の文のin place on banks
はどういう意味ですか。
BBCのhttp://www.bbc.co.uk/worldservice/learningenglish/newsenglish/witn/2007/06/070615_nkorea_macau.shtml
の第二パラグラフです。どうかよろしくお願いします。

In February the US agreed in principle that the money should be returned, but it didn't lift restrictions in place on banks around the world having any dealings with North Korea. The result was that no bank was willing to physically handle the money locked up in BDA and get it back to North Korea. They were worried about breaking US law.

北朝鮮のバンコデルタの口座凍結の話なんですが、以下の一つ目の文のin place on banks
はどういう意味ですか。
BBCのhttp://www.bbc.co.uk/worldservice/learningenglish/newsenglish/witn/2007/06/070615_nkorea_macau.shtml
の第二パラグラフです。どうかよろしくお願いします。

In February the US agreed in principle that the money should be returned, but it didn't lift restrictions in place on banks around the world having any dealings with North Korea. The result was that no bank wa...続きを読む

Aベストアンサー

そのサイトの下のほうの解説に

lift restrictions in place
cancel existing official rules that limit what people can do

とありました。なのでexistingを意味すると思います。

ちなみに、ロングマン英英でplaceを引いたらin placeについては

in the correct position
existing and ready to be used

と出ていました。この場合はexistingに当たると思います。

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のインスタンスを保持
}
}

QPoor planning may result in choosing a job ( ) you

Poor planning may result in choosing a job ( ) you not be truly successful.この( )の中はどれですか?簡単に解説もお願いします。
①of which ②to which ③in which ④that
これの答えは3のin which なのですが
4番のthatがダメな理由がわかりません

youからsuccessfulはsvcの完全文なので
a job の同格のthatを入れてはダメなのでしょうか?

Aベストアンサー

you not be truly successful ( in the job). だからです。

可能なら、 in that でもよいとは思います。

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ランキング