dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか?
(チェックボックス 空欄) sql (チェックボックス 空欄)
begin;
declare cursor_name cursor
for
select * from user_ad;
fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい
注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!!
ふつうに、select文でとりだすなら分かるのですが。。。
con = Connectionのこと
処理ソースは、、、
必要最小限な部分だけ、記述しています。
PrepareStatement stmt = null;
try {
String sql = "select user_id from user_ad";
this.stmt = con.prepareStatement(sql);
//ループでデータとりだし
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
String userId = rs.getString("user_id");
}
}catch(Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());
}
fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
「fetch forward 3 from cursor_name」というSQLはPostgreSQLの拡張なので、
PostgreSQLのJDBCドライバであれば
Statement#setFetchSize()で指定行数を取得することは実行可能のようです。
(根拠 →
http://www.postgresql.jp/document/pg743doc/html/ …
ただし未検証の上、PostgreSQL7.4.3のドキュメントなので断言できませんが。
前のレスで、「ResultSetオブジェクトに・・・結果をセットしています」といいましたが
実際には
1.データベースよりデータを取得してメモリ上にデータキャッシュ
2.仮想テーブルのキャッシュデータへポインタをあてる
という状態となります。
(下記が参考になると思います
http://www.atmarkit.co.jp/fjava/rensai2/jspservl …
Statement#setFetchSize()でできることは
この仮想テーブルへのデータキャッシュについて、
デフォルトは全件とってきて乗せるところを
指定行数ずつ乗せるよう変えられるのだと思います。
またキャッシュ範囲がrs.next() で超えた場合、
次のデータ取り出しを自動に行います。
(参考:
http://inoccu.net/blog/tag/seaser2/)
そのためrs.next()でループすると3件どころか全部出てくるのだと考えられます。
(DB2で検証したところそうなりました)
ただしドキュメントを読む限り、
PostgreSQLのJDBCドライバでは違う挙動、
すなわちStatement#setFetchSize()で指定した行数だけ取得するみたいです。
ただしそれはStatement#setMaxRows()を指定したときと同じ動作だと思いますが。
>また、どうしても分りにくいのですが、
>「ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数」
>= つまり、これはdbからとりだすデータがselect結果より多い時と少ない時では、多い時に有効なのでしょうか?
setFetchSize()を使う目的は、パフォーマンスチューニングです。
たとえばデータベースのレコードが100万件もあるような膨大なデータを扱うとき、
この100万件を一気にメモリへキャッシュすることは
大きなパフォーマンス劣化とメモリ資源消費の懸念があります。
メモリの積載が少ないPCでは、エラーが発生してしまうでしょう。
これらを補うためsetFetchSize()でフェッチ件数を調整し、
パフォーマンスの向上を図ることが可能になります。
ありがとうございます。
>
setFetchSize()を使う目的は、パフォーマンスチューニングです。
たとえばデータベースのレコードが100万件もあるような膨大なデータを扱うとき、
この100万件を一気にメモリへキャッシュすることは
大きなパフォーマンス劣化とメモリ資源消費の懸念があります。
メモリの積載が少ないPCでは、エラーが発生してしまうでしょう。
これらを補うためsetFetchSize()でフェッチ件数を調整し、
パフォーマンスの向上を図ることが可能になります。
これについては、fetchSize()で件数を决めると、確かに、パフォーマンス上いいようなきがします。。。
その後色いろ試したところ、fetchSize()を指定し、それをwhileでループさせれば、fetchSize分とりだせるようになったのですが、、、
時間があきすぎたので、再度while文で質問するので、よければ回答お願いします。
ありがとうございました、とても参考になりました。。。
No.2
- 回答日時:
No1で示したAPIは、
ResultSetオブジェクトには3件ずつ
フェッチでDBアクセスして結果をセットしています。
しかしnext()で呼び出す時点では全件セットし終わった後になります。
質問者さんは3件セット毎に
結果セットの編集もしくは参照がしたいのですよね。
そういう場合には適してないようです。
どうもすみませんでした。
データベース製品によって、ベンダーの提供しているSQLドライバで
フェッチカーソルの扱いも違いがあるようです。
質問者さんの使用しているデータベースの製品名とバージョンはなんでしょう?
この回答への補足
ありがとうございます。
使用DBは、Postgresqlでバージョンは、PostgreSQL Database Server 8.1です。
>
ResultSetオブジェクトには3件ずつ
フェッチでDBアクセスして結果をセットしています。
というと、3件づつのかたまりで順にResultSetに渡されていると考えていいのでしょうか?
fetchSize()を使用しなければ、全てが順にResultSetに渡される。
javaの、StatementのsetFetchSize(),getFetchSize()を見てみたのですが、
「
この Statement で作成された ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数についてのヒントを JDBC ドライバに提供します。指定された値が 0 の場合、ヒントは無視されます。デフォルト値はゼロです。
」
これを見ると、dbからとりだすデータの行を指定できると言ってはいるのでしょうか?
fetchSizeを指定しなかったら、select結果全てがとりだされる、というわけではないのでしょうか?
また、どうしても分りにくいのですが、
「ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数」
= つまり、これはdbからとりだすデータがselect結果より多い時と少ない時では、多い時に有効なのでしょうか?
よろしくお願いします。
No.1
- 回答日時:
フェッチで結果セットを3行ずつResultSetにのせることは
次のコーディングで可能です
Statement stmt = con.createStatement();
stmt.setFetchSize(3);
ResultSet rs = stmt.executeQuery("実行SQL");
参考URLで解説がありましたので一読してみてください。
参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/ …
この回答への補足
ありがとうございます。
参考URL共に、確認してみました。
その場合どうしても分らないのですが、
rsの結果を3行とりだすには、
while(rs.next()){}を使用すると、fetchSizeに関係なく、全部とりだされてしまうのですが、
この場合、3行だけとりだすにはどうすべきなのでしょうか?
stmt.getFetchSize();では、3行とれているので、このメソッドを使用して処理するのかと思ったのですが。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
JDBCでの大量データ検索でResultsetの戻りが遅い
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBNULLについて
-
struts 2つの選択肢(selec...
-
visualstudio c#でデータベース
-
三菱GOTの画面切り替えについて
-
ボタンが活性化の場合とは、ボ...
-
グローバルIPアドレスの変更タ...
-
フォームで同じ複数のnameで違...
-
リクエストに応じたselectedの...
-
フォーム上で押されたボタンに...
-
腕時計の時報をならないように...
-
VB6 開発環境のエディタに行...
-
StrutsでPOSTのデータ(リクエ...
-
C# ログイン画面からメイン画面...
-
Formatでmmが月と分を意味する理由
-
jspでbeanを使いたいのです...
-
jspからServletを呼び、元のjsp...
-
ネット上でのリアルタイム通信...
-
エラーページ遷移後に入力値を残す
-
ActiveWorkbook.Pathの一つ下の...
-
webアプリを作ってます。エラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET DataReaderが開かれている
-
Formのデータが欠落することがある
-
DBNULLについて
-
「XML over HTTP」「非同期HTTP...
-
dbからデータをとりだす際、sql...
-
JavaScriptとACCESSデータベー...
-
ruby on railsでDataBaseのデー...
-
struts 2つの選択肢(selec...
-
C言語からデータベースにアクセス
-
これはXSS?
-
SqlServerのトランザクションに...
-
JSP データベースへの数回の接続
-
login,logoutのできるページ
-
腕時計の時報をならないように...
-
ボタンが活性化の場合とは、ボ...
-
リクエストに応じたselectedの...
-
三菱GOTの画面切り替えについて
-
フォーム上で押されたボタンに...
-
「<c:forEach タグが終了し...
-
webアプリを作ってます。エラー...
おすすめ情報