- PR -

ResultSetとStatementについて

1
投稿者投稿内容
yuuki
会議室デビュー日: 2003/10/29
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2003-10-29 22:20
初歩的なことで申し訳ないのですがどうも理解が出来ないため教えてください。

ResultSet rs = stmt.executeQuery();
などとした場合、この時点でrsにDBから取得した値が入っているのでしょうか?
もしくはrs.getString("koumoku");
とした時にStatementを通して取得しに行くのでしょうか?
win-win
常連さん
会議室デビュー日: 2003/03/23
投稿数: 49
投稿日時: 2003-10-29 23:35
うろ覚えですが ...

ResultSet rs = stmt.executeQuery();
を実行した時点では、rsにDBから取得した値は入っていないと思われます。
単に、java.lang.Runtime#totalMemory()及びjava.lang.Runtime#freeMemory()を
使って計測した結果、使用メモリの増え具合がわずかしか(確か100K弱ぐらい
だったような ...)なかったので、そのように推測した覚えがあります。
(プロファイリングツールを使えば、もっと正確に分かるんでしょうけれど ...)

ResultSet#next()を繰り返し実行するなかで、適当なタイミングで
或るnext()実行時に、DBからレコードを何件(何十件?)かずつ
まとめてフェッチしてきているようでした。

間違っていたら、すみません。
どなたかフォローをお願い致します。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-10-30 08:54
>ResultSet#next()を繰り返し実行するなかで、適当なタイミングで
>或るnext()実行時に、DBからレコードを何件(何十件?)かずつ
>まとめてフェッチしてきているようでした。
おそらくですが,

そういうことは仕様ではあえて決めず,実装に最適化の余地を残しておく
のが,JavaのAPIの常套手段だと思います.

とすると,巨大なテーブルをメモリ上に取ることはせず,必要に応じて取得する
という実装にするでしょう.RDBMS側の制約によりそのような実装が許されない
場合は別ですが.
tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2003-10-30 09:16
StatementにはsetFetchSize()というメソッドがあります.
これで1度に取得してくる結果のサイズを変更できます.
デフォルトは0で,この場合は全ての結果を1度に返すみたいです.
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-10-30 10:31
悪夢を統べるものさんのいうように実装依存じゃないかと思ってます。

引用:

単に、java.lang.Runtime#totalMemory()及びjava.lang.Runtime#freeMemory()を
使って計測した結果、使用メモリの増え具合がわずかしか(確か100K弱ぐらい
だったような ...)なかったので、そのように推測した覚えがあります。
(プロファイリングツールを使えば、もっと正確に分かるんでしょうけれど ...)


ほんとに見るんならパケットスニファしたほうが確実かもしれません
どんなパケットが流れるか詳細はわからないにせよ、おおよそ流れはつかめるでしょうし。

ただ、これをしたところで、テストしたJDBCドライバにおいてそうだというだけでしかないのですけれど。


引用:

yuukiさんの書き込み (2003-10-29 22:20) より:
初歩的なことで申し訳ないのですがどうも理解が出来ないため教えてください。



理解できないことは理解できないままにしておくのも手ですよ。
なんかよくわかんないけど、このオブジェクトにお願いしたらやってくれる、という程度で足りるときは多いものです。
(もちろん、慣れたら突っ込んだところを知ったほうがいいのは当たり前なんですが)
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2003-10-30 10:34
RDBMSの種類とJDBCドライバの種類によるのではないでしょうか。

引用:

tanaboさんの書き込み (2003-10-30 09:16) より:
StatementにはsetFetchSize()というメソッドがあります.
これで1度に取得してくる結果のサイズを変更できます.
デフォルトは0で,この場合は全ての結果を1度に返すみたいです.




setFetchSizeにしても、プリフェッチ(バルクフェッチ)をサポートしていないDBMSであればあまり意味のないものになりますし、APIリファレンスにも「より多くの行が必要なときに、データベースから取り出す必要がある行数についてのヒントを JDBC ドライバに提供します」と書いてあるので、そのヒントをどう生かすかはJDBCドライバ次第と思います。
_________________
yuuki
会議室デビュー日: 2003/10/29
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2003-10-30 11:42
なるほどJDBCとRDBMS次第なのですね。
実装面で自由度があるのは嬉しいです。
1

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