6

私はこれまで、完全に正常に機能しているデータベースのクエリにこのようなものを使用していました:

PreparedStatement prepStmt = dbCon.prepareStatement(mySql);
ResultSet rs = prepStmt.executeQuery();

しかし、それから私は自分の複数回rs.first();を繰り返すことができるようにするためにを使用する必要がありました。rsだから今使っています

PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);    

私の質問は、2つのパフォーマンスに関連しています。2番目のオプションを使用すると何が失われますか?2番目のオプションを使用すると、これまでに作成したコードに悪影響がありますか?

PS:私のアプリケーションは、バックエンドのOracle 11gデータベースを使用するマルチユーザーのデータベース集約型Webアプリケーション(Weblogic 10.3.4上)であることに注意してください。

ご清聴ありがとうございました。

アップデート

私の最大reslutsetサイズは1000行15-20列未満になります

4

2 に答える 2

9

スクロール可能性(2番目のオプション)を使用している場合は、次の点に注意してください。

重要:スクロール可能な結果セットのすべての行がクライアント側のキャッシュに格納されるため、結果セットに多くの行、多くの列、または非常に大きな列が含まれる状況では、クライアント側のJava仮想マシン(JVM)が失敗する可能性があります。大きな結果セットのスクロール可能性を指定しないでください。

出典:Oracle DatabaseJDBC開発者ガイドおよびリファレンス

于 2012-10-15T06:38:30.637 に答える
4

Oracleカーソルは順方向のみの構造であるため、スクロール可能なカーソルをシミュレートするために、JDBCドライバーは、反復処理時に同じ結果が返されるようにする場合、通常、結果をメモリにキャッシュする必要があります。 2回目の結果。クエリから返される結果の数とサイズによっては、アプリケーションサーバーで大量の追加メモリが消費される可能性があります。一方、これはResultSet、2回目の反復が1回目よりもはるかに効率的であることを意味するはずです。

必要な追加メモリが意味を持つかどうかは、アプリケーションによって異なります。ResultSet最大のものは1000行になるとあなたは言います。各行が500バイトであることがわかった場合(これは明らかにデータ型によって異なります。ResultSet数字がたくさんある場合ははるかに小さくなり、長い説明文字列がたくさん含まれている場合ははるかに大きくなる可能性があります) 、1000行はユーザーあたり500kbです。同時ユーザー数が1000人の場合、それはたった500 MBのストレージであり、おそらく禁止されているわけではありません。一方、100万人の同時ユーザーがいる場合、それは500 GBです。これは、おそらく、いくつかの新しいサーバーを購入していることを意味します。行が500バイトではなく5000バイトの場合は、

于 2012-10-15T06:34:01.990 に答える