2

現在、OFBiz ベースの ERP の展開に取り組んでいると、次の問題が発生しました。フレームワークのコードの一部が、resultSet.last() を呼び出して、結果セットの合計行を把握しています。Oracle JDBC Driver v11 および v10 を使用して、クライアント メモリ内のすべての行をキャッシュしようとし、十分なヒープ領域がないために JVM をクラッシュさせます。

調査の結果、問題は、Oracle JDBC がキャッシュを使用して、サーバーではなくクライアント側で Scrollable Cursor を実装していることにあるようです。datadirect ドライバーを使用すると、その問題は解決されますが、resultset.last() の呼び出しが完了するまでに時間がかかりすぎるため、アプリケーション サーバーはトランザクションを中止します。

datadirect ドライバーに頼らずに、oracle で jdbc を介してスクロール可能なカーソルを実装する方法はありますか?

特定の結果セットの長さを知る最も速い方法は何ですか??

よろしくお願いします

4

2 に答える 2

1

「特定の結果セットの長さを知るための最速の方法は何ですか」 本当に知る唯一の方法は、それらをすべて数えることです。電話帳に「SMITH」がいくつあるか知りたいとします。あなたはそれらを数えます。結果セットが小さく、すぐに到達した場合は問題ありません。EG 電話帳にガンダルフがたくさんいるわけではありません。

結果セットが大きい場合は、見積もりを行うことができるかもしれませんが、一般的に SQL が適切に設計されているわけではありません。

クライアントで結果セット全体をキャッシュしないようにするには、次を試してください。

select id, count(1) over () n from junk;

次に、各行には、結果セット内の行数を含む追加の列 (この場合は n) があります。ただし、カウントに到達するまでに同じ時間がかかるため、タイムアウトの可能性が高くなります。

妥協点は、最初の 100 (または 1000) 行を取得することであり、それ以降のページネーションについて心配する必要はありません。

于 2009-06-30T01:40:27.670 に答える
0

count を使用した提案された「回避策」は、基本的に DB サーバーによって行われる作業を 2 倍にします。最初にすべてを調べて結果の数をカウントし、次に同じ + 結果を返す必要があります。はるかに優れているのは、Gary (count(*) over() - analytics) が言及した方法です。ただし、ここでも、最初の出力がクライアントに返される前に、結果セット全体を作成する必要があります。そのため、大量の出力を消費するメモリが遅くなる可能性があります。

私の意見では、画面に表示したいページのみを選択するのが最善の方法です(+1で次のページが存在すると判断します)。たとえば、21行から41行までです。それが必要です。

于 2009-06-30T09:09:13.760 に答える