动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.在Oracle中选取有父子或树状关系.
.Oracle起动库时1102报错处理.
.LMT下表FREELIST的初步探索.
.Oracle Net8 网络配置和联接.
.查询条件句使用in比较好还是exis.
.Oracle数据库技术(36).
.系统从oracle版本转化为sqlserve.
.CLOB扩展块满出现的错误.
.Original: How to duplicate da.
.CSDN Oracle电子杂志创刊号发布.
.ORA-600 [2103]错误解决过程.
.Oracle 9i充分利用自动撤销管理的.
.LILO使用指南(中).
.Oracle9i中如何建立不同字符集的.
.教你在Oracle中通过网络连接导入.
.Oracle数据库文件移动.
.Oracle9i专题讲座精华集粹.
.浅谈基于Linux的Intranet环境建造.
.Oracle时间精确到时、分、秒处理.
.Linux: 单边生存之路.

OCIEnvCreate()多线程初始化的模式问题

发表日期:2008-2-9 |



  我最近才开始学习oci,看到有关多线程的部分时对于多线程情况下的mode参数设置有些疑问.
  1.在 Oracle Call Interface Programmer's Guide 中这样写"In order to take advantage of thread safety, an application must be running on a thread-safe platform. Then the application must tell the OCI layer that theapplication is running in multithreaded mode, by specifying OCI_THREADED for the mode parameter of the opening call to OCIEnvCreate()."也就是说在多线程的程序中需要用OCI_THREADED.
  2.而在oci本身自带的Multi-threading example中却是用OCI_DEFAULT
  调用的OCIEnvCreate().
  3.在文档中关于environment的mutex保护又有这样一段话
  "The following three scenarios are possible, depending on how many connections exist in each environment handle, and how many threads will be spawned in each connection
  1.If an application has multiple environment handles, but each only has one thread (one session exists in each environment handle), no mutexing is required.
  2.If an application running in OCI_THREADED mode maintains one or more environment handles, each of which has multiple connections, it also has the following options:
  Pass a value of OCI_NO_MUTEX for the mode of OCIEnvCreate(). In this case the application must mutex OCI calls by made on the same environment handle itself. This has the advantage that the mutexing scheme can be optimized based on the application design. The programmer must also insure that only one OCI call is in process on the environment handle connection at any given time.
  Pass a value of OCI_DEFAULT to OCIEnvCreate(). In this case, the OCI library automatically gets a mutex on every OCI call on the same environment handle."
  
  结合 2,3小第猜想假如在多线程的情况下假如每个env只包含一个数据库的连接,则不需要使用OCI_THREADED 来调用OCIEnvCreate().假如每个env包含多于一个的数据库连接则需要OCI_THREADED.
  因为我刚开始看oci的东西,所以还没有写过半程序来测试,希望有相关经验的大侠拔刀相助.
  希望感爱好的人一起研究一下.要试这个问题首先要写连接程序,我用c++写了简单的连接类现在已经调试通过了,写的匆忙没有什么错误控制代码.贴出来给大家讨论,因为我是第一次写所以肯定有不少问题,现在也是没有办法啊.希望大侠出现啊.
  h file
  #ifndef __ORACONNECT_H__
  #define __ORACONNECT_H__
  
  #include
  extern "C"
  {
  sWord OCIEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctXP,
  dvoid *(*malocfp)(dvoid *ctxp, size_t size),
  dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
  void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
  size_t xtramem_sz, dvoid **usrmempp);
  }
  
  class OraConnect
  {
  public:
  OraConnect();
  ~OraConnect();
  
  bool Connect();
  bool DisConnect();
  void setUsername(char* strusername);
  void setPassword(char* strpassword);

  void setDbname(char* strdbname);
  void checkerr(OCIError *errhp,sword status);
  
  protected:
  private:
  char username[128];
  char password[128];
  char dbname[128];
  
  //Set the OCI variable
  OCIEnv *envhp;
  OCIError *errhp;
  OCISession *authp;
  OCIServer *srvhp;
  OCISvcCtx *svchp;
  };
  #endif
  
  .cpp file
  #include "StdAfx.h"
  #include "Connect.h"
  
  OraConnect::OraConnect()
  {
  }
  
  OraConnect::~OraConnect()
  {
  }
  
  void
  OraConnect::setUsername(char* strusername)
  {
  strcpy(username,strusername);
  }
  
  void
  OraConnect::setPassword(char* strpassword)
  {
  strcpy(password,strpassword);
  }
  
  void
  OraConnect::setDbname(char* strdbname)
  {
  strcpy(dbname,strdbname);
  }
  
  bool
  OraConnect::Connect()
  {
  ub4 mode = OCI_SHAREDOCI_THREADED;
  //ub4 mode=OCI_DEFAULT;
  //Create the envirnment.
  //(void) OCIEnvCreate(&envhp, mode, (CONST dvoid *)0, 0, 0, 0, (size_t)0, (dvoid **)0);
  (void) OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,(dvoid * (*)(dvoid *, size_t)) 0,(dvoid * (*)(dvoid *, dvoid *, size_t))0,(void (*)(dvoid *, dvoid *)) 0 );
  (void) OCIEnvInit( (OCIEnv **) &envhp, OCI_DEFAULT, (size_t) 0,(dvoid **) 0 );
  
  
  //Allocate the handle
  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0);
  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,(size_t) 0, (dvoid **) 0);
  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX,(size_t) 0, (dvoid **) 0);
  
  //Set the db link name.
  (void) OCIServerAttach( srvhp, errhp, (text *)dbname, strlen(dbname), 0);
  /* set attribute server context in the service context */
  (void) OCIAttrSet( (dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp,(ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp);
  (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp,(ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);
  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) username, (ub4) strlen((char *)username),(ub4) OCI_ATTR_USERNAME, errhp);
  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) password, (ub4) strlen((char *)password),(ub4) OCI_ATTR_PASSWORD, errhp);
  checkerr(errhp, OCISessionBegin ( svchp, errhp, authp, OCI_CRED_RDBMS,
  (ub4) OCI_DEFAULT));
  (void) OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX,(dvoid *) authp, (ub4) 0,(ub4)OCI_ATTR_SESSION, errhp);
  return true;
  }
  
  bool
  OraConnect:isConnect()
  {
  if (errhp)
  (void) OCIServerDetach( srvhp, errhp, OCI_DEFAULT );
  if (srvhp)
  checkerr(errhp, OCIHandleFree((dvoid *) srvhp, OCI_HTYPE_SERVER));

  if (svchp)
  (void) OCIHandleFree((dvoid *) svchp, OCI_HTYPE_SVCCTX);
  if (errhp)
  (void) OCIHandleFree((dvoid *) errhp, OCI_HTYPE_ERROR);
  if(envhp)
  (void) OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);
  return true;
  }
  
  void
  OraConnect::checkerr(OCIError *errhp,sword status)
  {
  text errbuf[512];
  sb4 errcode = 0;
  
  switch (status)
  {
  case OCI_SUCCESS:
  break;
  case OCI_SUCCESS_WITH_INFO:
  (void) printf("Error - OCI_SUCCESS_WITH_INFO\n");
  break;
  case OCI_NEED_DATA:
  (void) printf("Error - OCI_NEED_DATA\n");
  break;
  case OCI_NO_DATA:
  (void) printf("Error - OCI_NODATA\n");
  break;
  case OCI_ERROR:
  (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
  errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
  (void) printf("Error - %.*s\n", 512, errbuf);
  break;
  case OCI_INVALID_HANDLE:
  (void) printf("Error - OCI_INVALID_HANDLE\n");
  break;
  case OCI_STILL_EXECUTING:
  (void) printf("Error - OCI_STILL_EXECUTE\n");
  break;
  case OCI_CONTINUE:
  (void) printf("Error - OCI_CONTINUE\n");
  break;
  default:
  break;
  }
  }
  
  在调试中反而发现了一个怪问题,当我的mode设置成OCI_SHAREDOCI_THREADED,用OCIEnvCreate调用会crash,不过假如单用OCI_SHARED或OCI_THREADED就不会有问题,假如用
  OCIInitialize和OCIEnvInit来替代OCIEnvCreate则没有什么问题,不过我觉得是我自己的编译参数不太对吧.我的环境是(oracle8.1.7,windows2000 professional,vc6(sp5)).
  调用代码.
  OraConnect conn[10];
  for(int i=0;i<10;i++)
  {
  conn[i].setUsername("skyems");
  conn[i].setPassword("skyems");
  conn[i].setDbname("skydb");
  conn[i].Connect();
  }
  
  for(int j=0;j<10;j++)
  {
  conn[j].DisConnect();
  }
  试了试,应该是没什么问题的.试了试,应该是没什么问题的.h file中的extern声明是因为oci是个c接口
上一篇:一个DBA_Monitor.sql程序 人气:594
下一篇:ORACLE在HP-UX下的系列问题处理(50) 人气:506
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成