[转] proc oracle 连接释放不了的问题
转自:http://www.91linux.com/html/article/database/oracle/20081205/14333.html
proc oracle 连接释放不了的问题
笔者公司的应用系统每隔一段时间,oracle连接就达到上限了;怀疑是应用没有正确的释放oracle连接;说来惭愧,proc断断续续的用了几年,可
能是以前公司的代码写得太好了,从没有去关心基本的proc连接、释放是怎么处理的,这问题逼得我得去熟悉这方面的东西了;弄了两天才找到问题的根源,其
中大半时间是熟悉原系统的代码、定位问题,其他时间是找网上的资料看、做相关的测试;
经过分析,将问题定位在了数据库打开、关闭的相关函数;后台c++应用的根本没有成功的释放oracle 连接,数据库操作函数如下:
sql_context db_open(const char* usr, const char* pwd)
{
EXEC SQL BEGIN DECLARE SECTION;
sql_context ctx;
char username[64];
char passwd[64];
EXEC SQL END DECLARE SECTION;
struct sqlca sqlca;
EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :ctx;
EXEC SQL CONTEXT USE :ctx;
strcpy(username,usr);
strcpy(passwd,pwd);
EXEC SQL CONNECT :username IDENTIFIED BY :passwd;
if (sqlca.sqlcode)
{
printf( "连接oracle数据库失败!");
return NULL;
}
return ctx;
}
int db_close(sql_context ctx)
{
struct sqlca sqlca;
EXEC SQL CONTEXT FREE :ctx;
if( SQLCODE != 0 )
{
printf( "断开数据库连接失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc );
return -1;
}
return 0;
}
经过测试,发现以上db_close根本没有释放数据库连接;经过和网上示范程序的对比,终于发现了问题:
原
来oracle 的sql context,需要 release之后,才能正确释放数据库连接;如果不做release,free
context不会报任何错误(即db_close中并不返回-1),但是数据库连接却不会释放(对oracle的这个处理机制,汗一个-_-|||,或
者说明我的proc比较弱吧,可能还有别的解决办法);
把db_close改成如下,问题解决:
int db_close(sql_context ctx)
{
struct sqlca sqlca;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL COMMIT WORK RELEASE;
EXEC SQL CONTEXT FREE :ctx;
if( SQLCODE != 0 )
{
printf( "断开数据库连接失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc );
return -1;
}
return 0;
}
注意
相关文档:
今天在一台2003server上安装 9i客户端。
配置了tns之后连接,报错 "ORA-06413 连接未打开错误".
把其它服务器的tnsname.ora直接拷贝过来也不行。
后来查了一下资料,说应用程序路径里边有特殊字符。
这才恍然大悟,两年前这个问题已经折磨过我一次了,脑子不好,竟然给忘了。
原因就是64位系统环境下安装oracle,oralc ......
--在应用程序中往往有些固定的数据库操作,我们常常为致谢固定的操作定义了一些存储过程。这些存储过程不仅
--可以简化客户端的应用程序的开发和维护。而且还可以提高应用的运行性能。
-- 创建存储过程的语法。
create [or replace] procedure <过程名>[(参数)]
is|as
[局部变量声明]
begin
......
作者:易文俊
邮箱:yiwenjun@126.com
首先要把Oracle 的监听和服务两项打开
打开odbc数据源配置界面,选择系统DSN,添加,选择Oracle驱动程序
关键是下面参数的设置
Data source name:自己为该数据源命的名
description:随便自己描述啦
TNS server name:下拉菜单有(如果没有的话,就自己在net configuration assist ......