- - PR -
ResultSetとStatementについて
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-10-29 22:20
初歩的なことで申し訳ないのですがどうも理解が出来ないため教えてください。
ResultSet rs = stmt.executeQuery(); などとした場合、この時点でrsにDBから取得した値が入っているのでしょうか? もしくはrs.getString("koumoku"); とした時にStatementを通して取得しに行くのでしょうか? | ||||||||
|
投稿日時: 2003-10-29 23:35
うろ覚えですが ...
ResultSet rs = stmt.executeQuery(); を実行した時点では、rsにDBから取得した値は入っていないと思われます。 単に、java.lang.Runtime#totalMemory()及びjava.lang.Runtime#freeMemory()を 使って計測した結果、使用メモリの増え具合がわずかしか(確か100K弱ぐらい だったような ...)なかったので、そのように推測した覚えがあります。 (プロファイリングツールを使えば、もっと正確に分かるんでしょうけれど ...) ResultSet#next()を繰り返し実行するなかで、適当なタイミングで 或るnext()実行時に、DBからレコードを何件(何十件?)かずつ まとめてフェッチしてきているようでした。 間違っていたら、すみません。 どなたかフォローをお願い致します。 | ||||||||
|
投稿日時: 2003-10-30 08:54
>ResultSet#next()を繰り返し実行するなかで、適当なタイミングで
>或るnext()実行時に、DBからレコードを何件(何十件?)かずつ >まとめてフェッチしてきているようでした。 おそらくですが, そういうことは仕様ではあえて決めず,実装に最適化の余地を残しておく のが,JavaのAPIの常套手段だと思います. とすると,巨大なテーブルをメモリ上に取ることはせず,必要に応じて取得する という実装にするでしょう.RDBMS側の制約によりそのような実装が許されない 場合は別ですが. | ||||||||
|
投稿日時: 2003-10-30 09:16
StatementにはsetFetchSize()というメソッドがあります.
これで1度に取得してくる結果のサイズを変更できます. デフォルトは0で,この場合は全ての結果を1度に返すみたいです. | ||||||||
|
投稿日時: 2003-10-30 10:31
悪夢を統べるものさんのいうように実装依存じゃないかと思ってます。
ほんとに見るんならパケットスニファしたほうが確実かもしれません どんなパケットが流れるか詳細はわからないにせよ、おおよそ流れはつかめるでしょうし。 ただ、これをしたところで、テストしたJDBCドライバにおいてそうだというだけでしかないのですけれど。
理解できないことは理解できないままにしておくのも手ですよ。 なんかよくわかんないけど、このオブジェクトにお願いしたらやってくれる、という程度で足りるときは多いものです。 (もちろん、慣れたら突っ込んだところを知ったほうがいいのは当たり前なんですが) | ||||||||
|
投稿日時: 2003-10-30 10:34
RDBMSの種類とJDBCドライバの種類によるのではないでしょうか。
setFetchSizeにしても、プリフェッチ(バルクフェッチ)をサポートしていないDBMSであればあまり意味のないものになりますし、APIリファレンスにも「より多くの行が必要なときに、データベースから取り出す必要がある行数についてのヒントを JDBC ドライバに提供します」と書いてあるので、そのヒントをどう生かすかはJDBCドライバ次第と思います。 _________________ | ||||||||
|
投稿日時: 2003-10-30 11:42
なるほどJDBCとRDBMS次第なのですね。
実装面で自由度があるのは嬉しいです。 | ||||||||
1
