JDBC経由でのOracleサポートサーバサイドスクロール可能カーソルをしていますか?

StackOverflow https://stackoverflow.com/questions/1060545

  •  21-08-2019
  •  | 
  •  

質問

現在OFBizベースのERPの導入で働いて、私たちは次のような問題に来ている:フレームワークのコードの一部は、結果セットの合計行を知ってresultSet.last()を呼び出します。 OracleのJDBCドライバのV11とV10を使用して、それが十分なヒープ領域がないため、JVMをクラッシュ、クライアントメモリ内のすべての行をキャッシュしようとします。

調査した結果、問題は、Oracle JDBCは、キャッシュを使用することにより、クライアント側では、代わりのサーバーでスクロール可能カーソルを実装することのようです。 DataDirectドライバを使用して、その問題を(解決し、呼び出しがresultset.lastするものと思われる)ので、アプリケーションサーバは、

トランザクションをアボートし、完了するために、あまりにも多くかかります

DataDirectドライバに頼らなくても、OracleでのJDBC経由でスクロール可能なカーソルをimplementeする方法はありますか?

とどのような

??指定されたResultSetの長さを知るための最速の方法です 事前に

のおかげで イスマエル

役に立ちましたか?

解決

「指定されたResultSetの長さを知るための最速の方法は何か」 本当に知っている唯一の方法は、それらすべてをカウントすることです。あなたは、SMITHの電話帳にあるどのように多くの」知りたいです。あなたはそれらを数えます。 それは、小さな結果セットで、かつ迅速に到着した場合、それは問題ではありません。 EGは、電話帳に多くのGandalfsが存在しないであろう、そしてあなたはおそらく、とにかくそれらすべてを取得したい。

それは、大きな結果セットである場合は、

、あなたはそれが一般的にSQLのためにうまく設計されたものではないのですが、見積もりを行うことができるかもしれない。

クライアントに結果セット全体をキャッシュしないようにするには、あなたが試すことができます。

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

次に、各列は、結果セット内の行の数と(この場合、nの)追加の列を有することになります。しかし、それはまだ、まだタイムアウトの強い可能性がありますので、回数に到達する時間の同じ量がかかります。

妥協点は最初の百(または数千)の行を取得し、それを超えページネーションの心配はありませんです。

他のヒント

のカウントであなたの提案「の回避策は、」基本的にDBサーバが行った作業を倍増します。これは、最初の結果の数をカウントし、同じ+リターン結果を行うためにすべてを歩く必要があります。はるかに良いゲイリー( - 分析COUNT(*)を超える())で述べた方法があります。第一の出力がクライアントに返される前に、しかし、ここでも全体の結果セットを作成する必要があります。だから、それは潜在的に大きな出力のために消費するメモリを遅くされます。

私の意見では、

ベストな方法は、(つまり、次のいずれかが存在するかを決定するために1)あなたは、画面にしたいページのみを選択している例21から41までの行と、誰かがそれを必要とする(まれ)のケースでそれらすべてをカウントする別のボタン(ユースケース)を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top