免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2198 | 回复: 3
打印 上一主题 下一主题

OCI 的问题,关于cursor leak [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-08 10:27 |只看该作者 |倒序浏览
1) 我使用OCIStmtPrepare2 , 怎么才能把cursor 释放掉, orafaq 里有人说过这个问题可以OCIStmtRelease,但好象不起作用(实际可以)

OCI doc 里说OCIStmtExecute OCI_EXACT_FETCH 应该可以,这个还是有问题。

OCILogout 肯定可以,但这个效率.... 希望不是这个

2) 如果 OCIStmtPrepare2 对 select 和 其他query,比如 update xxx where  id in (select  id from xxxx ) 这样的语句执行后, OCIStmtRelease 有区别么?(没有)


严重声明:本贴及以下内容可能存在错误,容易导致误解的事情发生。希望没有实际开发经验的不要盲目相信。

经过努力挖掘,我认为,OCI 的开发仅能局限在LWP环境里,如果陷进MP里有无尽的烦恼事情要处理。

从OCI文档里也可以看出,Oracle 的开发团队里的结论也是这个,不知道他们有没有吃过苦头 :),毕竟能写Oracle的OCI出来也是很(弓虽)的。

我认为,他们不这么说,就是他们的错,万一这么说了,被别的牛人嘲笑? 我不怕,所以我这么说。仅在LWP里好多了。

[ 本帖最后由 lyxmoo 于 2006-5-30 06:35 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-08 11:10 |只看该作者

metalink 里有人回答这样的可以,我没有metalink帐号,别人帮我查的 :)

OCIStmtPrepare2 ( getServerCxt(),
&stmth,
errhp,
( text * ) stmt.c_str(),
stmt.length(),
0,
0,
OCI_NTV_SYNTAX,
OCI_DEFAULT));

OCIStmtExecute( getServerCxt(),
stmth, errhp, 0, 0, 0, 0, OCI_DEFAULT));

OCIDefineByPos ( stmth, &def, errhp, pos, buffer, len, datatype, &ind,
NULL, NULL, OCI_DEFAULT );

OCIStmtFetch2( stmth , errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT );

OCIStmtRelease ( stmth, errhp, 0, 0, OCI_DEFAULT);

论坛徽章:
0
3 [报告]
发表于 2006-05-08 13:29 |只看该作者

我用同样的方法,还是释放不掉。

忘了哪个名人说过的话:不要随便怀疑编译系统有问题,可是偶生存唯一目标就是为了证明这个问题的存在。

[ 本帖最后由 lyxmoo 于 2006-5-8 16:11 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-05-10 07:46 |只看该作者

回复 1楼, OCI 不胜其烦

for ( connect_socket  loop max_connections )
{
   OCILogon(env config setting);
};

each time query ( get one connect_socket)
{
   OCIStmtprepare(query_string);
   OCIStmtExecute(stmt_queryHandle);
   OCIHandleFree(queryHandle & errHandle);


release (the connect_socket);
};

如上执行,总会产生 v$open_cursor leak;

佛:如果执行
for (many times)
{
    get one connect_socket;
   OCIStmtprepare(query_string);
   OCIStmtExecute(stmt_queryHandle);
   OCIHandleFree(queryHandle & errHandle);

   release (the connect_socket);

}

如上执行则不会有 leak 产生;

说明: 如果same connect_socket from connect_pool, 则总能释放掉的。

也就是说: 如果多个同样的StmtPrepare , 在不同的OCIConnectionEnv 里,做HandleFree 或者OCIRelease 的时候,只能释放掉其中一个OCIConnection 里的Stmt。

或者OCIBindByName 和OCIBindByPos 对此有点用处。想办法试一下。

这个问题的根源,基于我现在的认识,我认为在于Oracle 设计OCI connect pool 的时候,假设每个人都必须使用它后续版本中的CPool 和 SPool 机制进行软件开发,而同时,并没有说清楚OCI API 之间的相互关联, 或者说必须要通过SPool + CPool 才能完成正确的获取释放机制。

店大欺客都存在,M$也是一样的,BigBlue也是一样。a96584 基本上也就是随便并行的说说,其中的相互交错关系并没有说明白。

哪位先贤能更好的解释一下我这个疑惑。是不是如我所说的这样。

[ 本帖最后由 lyxmoo 于 2006-5-30 06:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP