9

ResultSet rswithnオブジェクトがあるとします。

このコード:

while(rs.next()) {
   // do something on rs
}

は、アルゴリズム的にこのコードと同じです (つまり、両方とも同じ結果になりました):

for(i=1; i<=n; i++) {
   rs.absolute(i)
   // do something on rs
}

しかし、これはスルーに関して同等ですか? 最初の方が速いですか?または、特定iの の場合、rs.next() は単なるラッパーrs.absolute(i+1)ですか?

よろしくMC

4

2 に答える 2

6

rs.nextより単純な種類のデータベース カーソル ( FORWARD_ONLY) が要求されるrs.absoluteため、ほとんどの場合、 を使用するとパフォーマンス/リソース効率が低下しrs.absoluteます。FORWARD_ONLYとにかくカーソルの最適化がない特定のケースでは、同じパフォーマンスが得られる場合があります。

一部のドライバーは、要求されたレコードが次のレコードであることを検証する場合absoluteでも呼び出しを許可する場合がありますが、他のドライバーはFORWARD_ONLY関係なく例外をスローする場合があります。

于 2012-12-19T14:31:27.010 に答える
2

前者のrs.next()方が高速な場合がありますが、基盤となる実装によって異なりますが、実際には、内部最適化により同じパフォーマンスが得られる場合があります。

ドライバーは、現在の位置を考慮に入れていない可能性があります。そのため、ドライバーは前進rs.absolute()しているだけで、わずかにオーバーヘッドが発生する可能性があります。rs.next()

したがって、すべての結果を反復処理する必要がある場合は、を使用してください。rs.next()特定の結果にスキップする必要がある場合は、を使用してrs.absolute()ください。

結果セットは実際にはデータベースによってリモートで処理されることが多いことを忘れないでください(その場合を除くCachedResultSet)。そのため、行き来する際には、思ったよりも多くのオーバーヘッドが発生する可能性があります。

于 2012-12-19T14:33:45.997 に答える