多线程访问数据库的安全性
来源:互联网 发布:unity3d角色模型下载 编辑:程序博客网 时间:2024/05/17 23:48
环境:Linux + oracle 10g + C
方法:多线程环境下对数据库(Pro*C)进行检索,使用游标。
DBReturn ProcHandle::Test (IN string &sRuleID)
{
struct sqlca sqlca; /*define local sqlca for thread-safe */
EXEC SQL WHENEVER SQLERROR GOTO error;
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL CONTEXT USE :ctx[m_ctx_index];
EXEC SQL BEGIN DECLARE SECTION;
......
EXEC SQL END DECLARE SECTION;
.......
EXEC SQL
DELETE FROM Test WHERE RULEID = :s_RuleID;
EXEC SQL COMMIT;
if(sqlca.sqlcode==0)
{
rv = DB_OK;
return rv;
}
return rv;
error:
rv = sql_error();
return rv;
notfound:
EXEC SQL ROLLBACK;
return DB_NotFound;
}
我们使用多线程来对Test进行并发调用,当并发量达到10w后如果没有 struct sqlca sqlca;这条语句就将会频繁报错误。
错误内容如下(截取关键部分):
- ORA-01403: no data found
- ORA--1002: Message -1002 not found; product=RDBMS; facility=ORA
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- ORA--2114: Message -2114 not found; product=RDBMS; facility=ORA
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
结果分析:
如果不在函数入口处重新定义sqlca,系统将使用系统全局定义的sqlca作为数据库连接域,而这种情况下,在多任务的模式下线程是不安全的,很可能被其他线程close掉。
- 多线程访问数据库的安全性
- 多线程fork的安全性
- 函数的多线程安全性
- 多线程的安全性问题
- access数据库的安全性
- 数据库的安全性
- 数据库的安全性
- 数据库的安全性
- 数据库的安全性
- [赚外快]警惕Delphi的VCL组件多线程访问的不安全性
- epoll的多线程安全性问题
- 多线程下单例模式的安全性
- 【Java多线程】线程的安全性
- 关于多线程访问sqlite 数据库的思考
- 多线程访问数据库
- 多线程访问数据库
- 多线程安全性
- 多线程安全性
- Asp.NET导出excel的方法
- Pro*C 线程安全问题案例
- C/C++编程个人心得
- 一个吻,征服一个女人
- 基于uclinux的sopc应用程序设计
- 多线程访问数据库的安全性
- 搜索引擎免费登陆入口大全
- 好书推荐:《价格理论》
- 修炼一名程序员的职业水准(林庆忠__署名原创)
- asp.net里导出excel表方法汇总
- Linux下守户进程的开发与利用
- 灵魂的颜色
- Programming Windows 章二:Unicode简介
- 關于在asp.net中得不到更新的值﹐