1

Javaでソフトウェアをプログラミングし、Oracle DBを使用しています。

通常、次のようなループを使用してデータベースから値を取得します

Resultset rt = (Resultset) cs.getObject(1);

while(rt.next){
    ....
}

しかし、データベースから何千ものデータをフェッチするときは、より遅く聞こえます。

私の質問は:

Oracle DB の場合: このようなプロシージャを作成しました。これは反復データであり、カーソルに割り当てます。

Ex.procedure test_pro(sysref_cursor out info) as

open info select * from user_tbl ......

end test_pro;

JAVA コードの場合: 前に述べたように、resultset値を取得するために反復処理を行いますが、データベース側では、値を選択しても、その値を取得するためにループを使用する必要があるのはなぜですか?

(.net フレームワークのもう 1 つの事実として、データベース バインディングの概念が使用されています。Java の場合も同様で、.net のようなデータベース プロシージャを反復せずにバインドします。)

4

4 に答える 4

1

この場合のように、常に1つの結果が常に存在することがわかっている場合は、ifをスキップして、rs.next()を1回呼び出すこともできます。

例えば ​​:

ResultSet resultset = statement.executeQuery("SELECT MAX (custID) FROM customer");  
resultset.next(); // exactly one result so allowed  
int max = resultset.getInt(1); // use indexed retrieval since the column has no name 
于 2013-02-03T06:22:26.327 に答える
1

そのデータをどのような頻度で処理するかによって、ref_cursor の選択が良い場合と悪い場合があります。Ref_cursors は、レポート目的で、非 Oracle 対応プログラムにデータを渡す方法を提供することを目的としています。

あなたの場合、ループに固執しますが、配列フェッチを実装することを忘れないでください。これはパフォーマンスに多大な影響を与えるためです。データベースは行のブロックをクライアントの jdbc バッファーに渡し、コードはそのバッファーから行をフェッチします。バッファーの最後に到達するまでに、Jdbc レイヤーはデータベースから次の行のチャンクを要求し、多くのネットワーク ラウンド トリップを排除します。デフォルトでは、すでに一度に 10 行をフェッチしています。セットが大きい場合は、メモリに余裕がある場合は、より大きな数を使用します。

Oracle® Database JDBC 開発者ガイドおよびリファレンス』を参照してください。

于 2013-02-03T17:42:14.060 に答える
0

はい、Javaでプロシージャを呼び出すことができます。 http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/

于 2013-02-03T06:22:54.550 に答える
0

ループは避けられません。パフォーマンス上の理由から、StatementまたはResultsetオブジェクトのプリフェッチを調整する必要があります(100は確実な開始点です)。
なぜこのように行われるのですか?これはストリームの読み取りに似ています-ストリームの大きさはわかりません-したがって、チャンク/バッファーで次々に読み取ります...

于 2013-02-03T14:08:56.440 に答える