- PR -

SQLのResultSetについて

1
投稿者投稿内容
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2009-01-29 11:57
Postgres8.2、 JDK1.5 でWebサーバーの開発を行っています。

SQLで検索を行った際にResultSetで結果を取得しますが、10万件という数の結果がヒットした場合、メモリ的には大丈夫なのでしょうか?
ResultSetはカーソルということで、データ容量自体はそれほど大きくないと思うのですが、この考え方はまちがっているのでしょうか?

ResultSetから実際にresultSet.getString(1)などのようにデータを取得して、10万
件もオブジェクトとして保持してしまえば、メモリを圧迫するとおもうのですが、
ResultSetのままであれば、大丈夫かどうか教えていただければ幸いです。

やりたいことは、下のようなコードなのですが、
ResultSetを取得し、resultSet.absolute(start)によって開始位置までカーソルを
移動させ、必要な分だけ(20件だけとか)データを取得しようと思っています。
そして、最後にResultSetのgetRow()メソッドを呼んで、ヒットしたデータ数を
取得したいと思っています。

ご教示頂ければ幸いです。
よろしくお願いいたします。


ResultSet rs;
int count = 0;
int hit_count = 0;
rs.absolute(start);
while(rs.next()){
 count++;
 result.addElement(getResult());
 if(count==limit){
break;
 }
}
rs.last();
hit_count= rs.getRow()



あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2009-01-29 12:19
試してみればよいと思います。
小さなテーブルを作って何回か直積するだけです。
二次元配列的に蓄えるのであればすぐにOutOfMemoryでしょう。

#何年も前に調べた時にはそんな実装のドライバもありました。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2009-01-29 12:37
試してみるのが一番早い話ですが・・・・

そんなこと気にするよりも、
件数を取得するSQLと
上位20件だけとか取得するSQLを流せば
気にする必要もないと思います。
LAUGHSMILE
会議室デビュー日: 2008/08/25
投稿数: 4
投稿日時: 2009-02-26 15:24
SQL文を工夫すれば、こんな問題を考えなくてもいいです。

例えば:
sqlserverのtop
oracleのrownum
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2009-02-28 19:02
ご回答ありがとうございました。

offset, limitが使えないDBを利用して組んだプログラムがすでにあり、それを使い
まわしたかったため、上記のような質問をした次第です。

今回はpostgresを使うため、limit, offsetを使って、プログラムを改変して使おうと思います。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2009-03-01 18:19
Statement.setFetchSizeを使います。
http://jdbc.postgresql.org/documentation/82/query.html#query-with-cursor

いくつかある制限事項にも注意してください。
1

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