2012-04-10 8 views
11

データベースから返されたカーソルを31ms(ミリ秒)で実行しました。ResultSet - カーソル:rs.next()多くの時間を費やす

しかし、ときに私が行

ResultSet rs = (ResultSet)cstm.getObject(6); 

    while(rs.next()){ 
    system.out.println("..."); 
    } 

ことができるものより40秒(40000ミリ秒)

を取って、カーソルの各行を横断するだけの単純なを取得するために1500個の以上の列を有するこのカーソルを使用完了?

答えて

16

、あなたが大きな値に設定されていない場合はこのように、あなたは正確に150回の次のレコードのデータベースを呼ぶ10のサイズをフェッチを使用して...

あなたがしなければなりません...とのfetchSizeを設定することにより、例えば100の性能をテストすることです:

statement.setFetchSize(100); 

あなたはあなたのエンバイロメントに応じてパフォーマンスを向上させるために、この番号で遊ぶことができます。

+0

ありがとうございました..代わりに私はResultSet.setFetchSize(100)を使用しました... – faraz

+0

偉大な:100は良いはいいいはずです – Mik378

+0

ありがとうMik378、あなたは私の一日を作った... !!! –

4

データベースによって返されるものあなたのカーソルRSに1500の以上の行を持っているが、そのカーソルを参照だけです。だからrs.next()を呼び出すときに、データベースcursrに行くたびにカーソルポインタで指されている現在のレコードを取得します。

毎回データベースにアクセスし、ループの繰り返しごとに1回のレコードを1500回以上フェッチするのに時間がかかることは明らかです。

デフォルトJDBCによって実際
+0

良い説明。 – Deepak

関連する問題