动态网站制作指南 [  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教程 ]的信息

本月文章推荐
.用动态SQL方法4连接 Oracle 的实.
.数据库监控工具 For Oracle v1.2.
.Oracle 10g数据库的安全性和身份.
.Oracle9i New Features.
.ORACLE SQL语句优化技术分析.
.局域网的组建:用 Red Hat Linux.
.Oracle以网格技术解决成本难题.
.linux下如何用exp导出oracle10g的.
.关于Import error ora-01658.
.Linux Shadow-Password-HOWTO.
.在RedHat 7.x 上实现reiserfs & .
.当数据积累到一定时间后执行会越.
.全面介绍:Oracle数据库日期处理.
.WEB 计划任务.
.Oracle和MySQL的一些简单命令对比.
.Oracle数据库软件包远程溢出漏洞.
.Linux系统病毒研究之一.
.项目中的oracle开发技巧.
.Oracle 9i 数据库管理实务讲座(一.
.创建交叉报表(oracle).

用Pro*C开发多线程应用程序

发表日期:2008-2-9 |



  (注:本文来自Pro*C/C++ Precompiler Programmer's Guide Release 8.1.5) 
  
  假如你的操作系统不支持线程,本文暂不适合你。本文包含以下几个部分: 
  
  n 什么是多线程? 
  
  n Pro*C中的运行时上下文 
  
  n 运行时上下文的使用模式 
  
  n 多线程应用程序的用户接口 
  
  n 多线程例子 
  
  一.什么是多线程? 
  一个多线程的应用程序中,线程运行在共享的地址空间里。线程是在进程内部执行的“轻量”级子进程,它们共享代码段和数据段,但是有自己的程序计数器、寄存器和堆栈。全局变量和静态变量在线程之间是共享的,因此通常需要在程序中使用某种互斥机制来治理线程对这些变量的访问,互斥体Mutexes就是用来保证数据完整性的同步装置。 
  
  有关互斥体的更多讨论,参看多线程编程方面的文章。 
  
  Proc*C编译器通过以下方式支持开发多线程的Oracle应用程序(在支持线程的平台上): 
  
  n 用一个命令行编译选项来产生线程安全的代码 
  
  n 用内嵌的SQL语句和指令支持多线程 
  
  n 线程安全的Lib库和其他客户端Lib库 
  
  注重:也许你的平台支持某个非凡的线程包,但还是需要查看Oracle有关平台的文档,看看Oracle是否支持它。 
  
  二.Pro*C中的运行时上下文 
  为了在线程和数据库连接之间建立松散的结合,Pro*C引入了一个概念runtime_context,我们称之为运行时上下文。一个运行时上下文包含了以下资源和信息: 
  
  n 与数据库服务器的连接 
  
  n 当前连接上使用的游标 
  
  n 内嵌的一些选项,如MODE,HOLD_CURSOR,RELEASE_CURSOR和 SELECT_ERROR 
  
  不仅仅是简单的支持线程和连接之间的松散结合,Pro*C编译器还答应开发人员在线程和运行时上下文之间建立松散的结合,Pro*C答应在程序里为运行时上下文定义一个句柄,通过这个句柄,运行时上下文可以在线程之间切换。 
  
  例如,一个交互式应用程序创建了线程T1,来执行一个查询,并且返回了前10条记录,然后T1终止。在用户输入了必须的数据之后,程序又创建了线程T2,并且把T1使用的运行时上下文传给T2,这样T2可以在同一个游标上获取接下来10条的记录。 
  
  三.运行时上下文的使用模式 
  下面是在多线程的Pro*C程序中使用运行时上下文的两种可能模式: 
  
  n 多线程共享单个运行时上下文 
  
  n 多线程使用互相独立的运行时上下文 
  
  不管采用哪种模式,不能在同一时刻多个线程共享同一个运行时上下文。假如两个或两个以上的线程在同一时刻试图使用同一个运行时上下文,将会出现以下错误:SQL-02131: Runtime context in use。 
  
  1.多线程共享单个运行时上下文 
  
  2.多线程使用互相独立的运行时上下文 
  
  四.多线程应用程序的用户接口 
  Pro*C编译器提供以下接口来支持多线程: 
  
  n 命令行选项,THREADS=YESNO 
  
  n 内嵌SQL语句和指令 
  
  n 线程安全的公共库函数 
  
  1.THREADS选项 
  在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生的C代码是线程安全的。假如指定了THREADS=YES,Pro*C将会检查每个包含SQL执行语句的函数,是否指定了这些语句是在哪个运行时上下文中执行的,若没有发现这类指定标识,编译器就会返回错误。 
  
  2.内嵌SQL语句和指令 
  下列内嵌的SQL语句和指令用于支持多线程和运行时上下文的使用: 
  
  n EXEC SQL ENABLE THREADS; 
  
  n EXEC SQL CONTEXT ALLOCATE :context_var; 
  
  n EXEC SQL CONTEXT USE {:context_var/DEFAULT}; 
  
  n EXEC SQL CONTEXT FREE :context_var; 
  
  在以上SQL语句中,context_var是运行时上下文句柄,它必须被定义成sql_context类型:如sql_context context_var; 
  
  使用DEFAULT意味着接下来的SQL语句将使用默认的全局运行时上下文,直到另一条CONTEXT USE语句覆盖它。
 
  
  n EXEC SQL ENABLE THREADS 
  
  这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL语句。 
  
  n EXEC SQL CONTEXT ALLOCATE 
  
  这条可执行SQL语句分配并初始化了一块用于指向一个新的运行时上下文的内存,并返回标识该上下文的句柄变量,该变量必须声明为sql_context类型。 
  
  n EXEC SQL CONTEXT USE 
  
  这条指令性语句告诉编译器接下去执行的SQL语句将使用指定的运行时上下文,这里的运行时上下文必须在此前已经用CONTEXT ALLOCATE分配并初始化。 
  
  n EXEC SQL CONTEXT FREE 
  
  这条语句释放了运行时上下文句柄指定的内存,并把它设置空值。 
  
  3.编程时要考虑的问题 
  尽管Oracle保证SQL库是线程安全的,但是你还是有责任保证你的Pro*C代码是为能在多线程下正确运行而设计的,例如,你必须考虑全局变量和静态变量的。 
  
  另外,多线程要求对以下问题进行考虑: 
  
  n 把sqlca结构定义成线程安全的。典型的做法是在每个函数开始定义一个同名的局部变量。 
  
  n sqlda结构也和sqlca结构一样处理。 
  
  n 把程序里的宿主变量定义成线程安全的。也就是说要小心处理程序里的全局变量和静态变量。 
  
  n 避免同一时刻不同线程使用同一个运行时上下文。 
  
  五.多线程例子 
  下面的例子运行在Red Hat9和Oracle9上。程序目的是用两个线程同时往一个表里插10000条记录,每个线程都拥有自己的运行时上下文。 
  
  #include 
  
  #include 
  
  #include /* Linux线程库头文件 */ 
  
  #include "sqlca.h" /* Oracle头文件 */ 
  
  #define SQLCODE sqlca.sqlcode 
  
  static int insert_data( sql_context ); 
  
  static int start(); 
  
  int 
  
  main() 
  
  { 
  
  pthread_t tid1, tid2; 
  
  /* 创建两个线程 */ 
  
  if( pthread_create( &tid1,NULL,(void *)start,NULL ) ){ 
  
  printf( "创建线程失败!\n" ); 
  
  exit(1); 
  
  } 
  
  if( pthread_create( &tid2,NULL,(void *)start,NULL ) ){ 
  
  printf( "创建线程失败!\n" ); 
  
  exit(1); 
  
  } 
  
  /* 等待线程退出 */ 
  
  if( pthread_join( tid1,NULL ) ){ 
  
  printf( "等待线程结束失败!\n" ); 
  
  exit(1); 
  
  } 
  
  if( pthread_join( tid2,NULL ) ){ 
  
  printf( "等待线程结束失败!\n" ); 
  
  exit(1); 
  
  } 
  
  exit(0); 
  
  } 
  
  
  int 
  
  start() 
  
  { 
  
  sql_context context; 
  
  strUCt sqlca sqlca; /* 需要在此定义一个局部的sqlca */ 
  
  char uid[] = "dev/888888"; 
  /* 以下SQL语句的执行顺序不能更改 */ 
  
  EXEC SQL ENABLE THREADS; 
  
  EXEC SQL CONTEXT ALLOCATE :context; 
  
  EXEC SQL CONTEXT USE :context; 
  
  EXEC SQL CONNECT :uid; 
  
  if( SQLCODE < 0 ){ 
  
  printf( "创建数据库连接失败,%d:%s\n", SQLCODE,sqlca.sqlerrm.sqlerrmc); 
  
  return -1; 
  
  }insert_data( context ); 
  
  EXEC SQL COMMIT WORK RELEASE; 
  
  if( SQLCODE < 0 ){ 
  
  printf( "断开数据库连接失败!%d:%s\n", SQLCODE,sqlca.sqlerrm.sqlerrmc ); 
  
  return -1; 
  
  } 
  
  EXEC SQL CONTEXT FREE :context; 
  
  return 0; 
  
  } 
  
  static int 
  
  insert_data( context ) 
  
  sql_context context; 
  
  { 
  
  struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */ 
  
  char name[11]; 
  
  int age; 
  
  int i; 
  
  strcpy( name, "test" ); 
  
  age = 20; 
  
  
  
  EXEC SQL CONTEXT USE :context; /* 指定执行SQL语句的上下文 */ 
  
  for( i=0; i<10000; i++ ){ 
  
  EXEC SQL INSERT INTO table1 VALUES ( :name, :age ); 
  
  if( SQLCODE < 0 ){ 
  
  printf( "插入纪录失败!
%d:%s\n", SQLCODE, sqlca.sqlerrm.sqlerrmc ); 
  
  return -1; 
  
  } 
  
  } 
  
  return 0; 
  
  }
上一篇:Oracle中三种上载文件技术(三) 人气:537
下一篇:用VC开发基于ORACLE数据库方法 人气:522
浏览全部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号