0

こんにちは、Web アプリケーションの Java クラスでストアド プロシージャを呼び出しています。jsp/HTML のレンダリングに時間がかかるレポートがいくつかあります。実行に 2 秒しかかからないストアド プロシージャ クエリも確認しました。オラクルブラウザ. 結果セットのフェッチ時間が非常に短いことがわかった SP 呼び出しコードをチェックしましたが、While(rst.next) で結果セットを反復しようとすると、while ループ内で SOP を出力するのにほぼ 3 分かかります。 ret.next() に問題があるはずです。私のコードは次のとおりです。

Connection connection   = null;
CallableStatement stmt  = null;
ResultSet rst           = null ;


connection = DBConnector.getConnection();

stmt = connection.prepareCall("{call MIS_GSGR_ASON.MIS_DIVNETSALE_ASON(?,?,?,?,?,?,?,?,?)}");


            stmt.setString(1,START_DT);                 
            stmt.setString(2,END_DT);                   
            stmt.setString(3,DIVISION);             
            stmt.setString(4,LOC_ID);   
            stmt.setInt(5,USER_GRP);
            stmt.setInt(6,FIELD_ID);
            stmt.setInt(7,Integer.parseInt(PERIOD_ID));
            stmt.setString(8,zone);
            stmt.registerOutParameter(9+INC,OracleTypes.CURSOR);
            stmt.execute();
            rst = (ResultSet) stmt.getObject(9+INC);

            System.out.println("Got resultset . . . .");

            data = new ArrayList<MainActionAll>();


            while(rst.next()){
            System.out.println("In loop");} 

どんな助けでも非常に感謝します、ありがとう、amol私を助けてください

4

1 に答える 1

0

遅いネットワーク経由でクエリを実行し、多くの行が返された場合、動作が非常に遅くなることがありますか?

時間のチェックを追加し、コンソールに出力する代わりに単純にレコードを数えます:

...
...
...
stmt.registerOutParameter(9+INC,OracleTypes.CURSOR);
long t0, t1, t2, t3, t4, t5;
t0 = System.currentTimeMillis();
stmt.execute();
t1 = System.currentTimeMillis();
rst = (ResultSet) stmt.getObject(9+INC);
t2 = System.currentTimeMillis();
System.out.println("Got resultset . . . .");
data = new ArrayList<MainActionAll>();
t3 = System.currentTimeMillis();
t4 = t3;
t5 = t3;

int rec_cnt = 0;
if (rst.next())
    {
    ++rec_cnt;
    t4 = System.currentTimeMillis();
    while (rst.next())
        ++rec_cnt;
    t5 = System.currentTimeMillis();
    }
System.out.println("execute: " + (t1 - t0));
System.out.println("stmt.getObject: " + (t2 - t1));
System.out.println("Array: " + (t3 - t2));
System.out.println("1st next: " + (t4 - t3));
System.out.println("loop: " + (t5 - t4));
System.out.println("rec cnt: " + (rec_cnt));

ネットワーク転送を減らすために、可能な限りデータベース サーバーの近くで実行してみてください (localhost を推奨)。それらの時間で質問を編集してください。

于 2012-07-19T08:30:45.470 に答える