- PR -

アプリでの最大オープンカーソルのエラーの回避方法

投稿者投稿内容
faulter
会議室デビュー日: 2005/03/06
投稿数: 11
投稿日時: 2005-04-13 16:33
インギ 様 Anthyhime 様

回答の方、ありがとうございました。
返信が遅くなりまして、申し訳ございません。

Anthyhime 様

引用:
--------------------------------------------------------------------------------


コード:
--------------------------------------------------------------------------------

> rs.close()はfinallyで行っていますが、
> 間違っていますか?

おそらく間違っています。ループのたびにSPでカーソルが取得されるのであればそのたびに開放しなくてはなりません。


--------------------------------------------------------------------------------



--------------------------------------------------------------------------------

ご指摘の通りです。
そのため、載せ直した修正後のサンプルコードではループのたびに呼ぶのではなく
取得した結果を、ループで条件わけ処理しています。
条件に合ったときのみ、ResultSetからデータを取得すると言った感じに。
ただ、これは 永井和彦 様 などから同様の指摘があり、修正したものは
サンプルコードは現在きちんとCURSORがクローズされているようで
修正後も増えていると思ったのは、私の勘違いでした、すみません。

そのほかのソースも見直して、同じようなミスをしている場所を発見したので
そこを修正した結果、CURSORの数は減りました。
なので、これは要因のひとつでありました。ありがとうございます。


インギ 様

引用:
--------------------------------------------------------------------------------


コード:
--------------------------------------------------------------------------------
ストアドプロシージャが関連するかどうかは、ストアドプロシージャを使わない場合と比べてみることで切り分けられるかと思います。お試し下さい。

--------------------------------------------------------------------------------

このケースも試してみました。(別箇所)
ストアドを使用しないケースだと
CURSORが増えないようです。
が、なぜかストアドだと
1回だけV$CURSORにいます。
ストアドとコーディングは以下のような感じです。
また自分のコーディングがどこかおかしいんだとは
思うのですが、1回だけと言うのがまた、良く分からない。。。
この件については、まだ未解決ですが、
解決したら、また、報告されていただこうと思います。
どこかで、また参照不明なCURSORを作っているだけ
かもしれないですが。。
もし、何かお気づきの点がありましたら、ご指摘下さい。


<ストアド>
PROCEDURE test_list(rcset OUT refcur)
IS

BEGIN
/*make sql statement*/
s_Sql := 'select code, name from testtable ORDER BY code';
/*set cursor*/
OPEN rcset FOR s_Sql;

END test_list;

<コーディング>
public DataMap getMap() throws Exception {
// initialized parameters
Connection con = null;
CallableStatement cStmt =null;
ResultSet rs = null;
DataMap map = new DataMap();

try {
//get Connection
con = ds.getConnection();
cStmt = con.prepareCall("{call test_list(?)}");
cStmt.registerOutParameter(1, OracleTypes.CURSOR);
cStmt.execute(); //execute procedure
// get ResultSet
rs = (ResultSet)cStmt.getObject(1);
map.setDataMap("","");//firstValue
while (rs.next())// set Type Master Data
{
String wk_code = rs.getString("code");// set Code
String wk_name = rs.getString("name"); // set Name
// set TimesList
map.setDataMap(wk_code,wk_name);
}
} catch (SQLException ex) {
throw ex;
} finally {
if (rs != null)rs.close();
if(cStmt != null)cStmt.close();
if(con != null)con.close();
}

return map;
}
Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2005-04-17 14:24
こんにちは。

ストアドでオープンしたカーソルは、ストアドでクローズしないといけないって
ことはないでしょうか?
(カーソルをクローズするストアドを作成してみるとか)

スキルアップ/キャリアアップ(JOB@IT)