Orcale中OCILogon和OCIServerAttach登录方式的区别分析

news2024/12/25 15:14:46

参考文档《Oracle Call Interface Programmer's Guide》

        在Orcale和DM数据库提供的API中,通过OCI方式接口连接数据库的方法有多个,这里只讨论OCILogon和OCIServerAttach的比较。

1、官方描述

根据文档里的描述:

OCILogon():This function is used to create a simple logon session for an application.

OCILogon()适用于应用程序对于某一数据库连接仅支持单用户进程。

OCI内部过程的调用顺序基本如下:
 OCIEnvCreate
 OCIHandleAlloc  <ERROR>
 OCILogon
 OCILogoff
 OCIHandleFree   <ERROR>
 OCIHandleFree   <ENV>

OCIServerAttach():This call is used to create an association between an OCI application and a particular server

OCIServerAttach()适用于应用程序对单一数据库连接需要维护多个用户会话

每个句柄在这里都是手工去创建。所有的OCI句柄都有其相关属性,这些属性存储了一些有用的数据。可以使用OCIAttrGet()获取对应信息,也可以通过OCIAttrSet()进行修改。OCIServerAttach() 创建了一个OCI操作的数据服务访问路径,OCISessionBegin() 确立用户会话连接。这里完成后,才可以进行实际的数据操作。注意这里的OCIAttrSet()和OCIServerAttach()的调用顺序不是固定的,类似的 OCISessionBegin() 和 OCIAttrSet() 先后顺序也是可以互换的。

2、结论

单个用户,单个连接

单个用户单个连接这种是最简单的登录方式,可以在应用对每个数据库连接仅维护一个用户会话的情况下使用

当应用调用OCILogon2()或OCILogon()时,OCI库对传递给它的服务上下文句柄进行初始化,为发请求的用户创建到指定Oracle数据库的连接。

非代理的多会话或多连接

非代理多会话或连接方式,通过显式地添加和调用启用会话函数来维护一个数据库连接上的多个用户会话和连接。 附加到 Oracle 数据库和开始会话的特定函数有:

OCIServerAttach()——为OCI操作创建到Oracle数据库地访问路径

OCISessionBegin()——为用户创建到特定Oracle数据库的会话。这个函数对于需要在Oracle数据库上执行操作的用户来说是必须的。

再次调用OCISessionBegin()时使用不同的服务上下文句柄和会话上下文句柄会导致前一个用户登出,并引发错误。要想同时运行两个不可互相替代的会话,第二次调用OCISessionBegin()函数时必须指定一个相同的服务上下文句柄和一个新的会话上下文句柄。

3、拓展介绍-句柄

3.1 定义

几乎每个OCI调用的参数列表中都会包含一个或多个句柄。一个句柄就是一个指向由OCI库分配的存储空间的不透明指针。应用可以使用句柄存储上下文或连接信息,例如环境或服务上下文句柄,也可以存储OCI函数或数据的信息,例如错误或describe句柄。句柄让编程变得简单,因为是使用库来维护数据而非应用来维护数据。
大多数OCI应用必须要获取存储在句柄中的信息,所以设计通过set和get属性的OCI调用,OCIAttrGet()和OCIAttrSet()来访问或设置这些信息。

3.2 句柄类型

        下表列出了OCI中的各类句柄,每种句柄类型对应的C数据类型以及在OCI调用中标识句柄类型的常量表示

描述

C数据类型

类型常量

OCI环境句柄

OCIEnv

OCI_HTYPE_ENV

OCI错误句柄

OCIError

OCI_HTYPE_ERROR

OCI服务和上下文句柄

OCISvcCtx

OCI_HTYPE_SVCCTX

OCI语句句柄

OCIStmt

OCI_HTYPE_STMT

OCI绑定句柄

OCIBind

OCI_HTYPE_BIND

OCI定义句柄

OCIDefine

OCI_HTYPE_DEFINE

OCI描述句柄

OCIDescribe

OCI_HTYPE_DESCRIBE

OCI服务器句柄

OCIServer

OCI_HTYPE_SERVER

OCI用户会话句柄

OCISesseion

OCI_HTYPE_SESSION

OCI验证信息句柄

OCIAuthInfo

OCI_HTYPE_AUTHINFO

OCI连接池句柄

OCICPool

OCI_HTYPE_CPOOL

OCI会话池句柄

OCISPool

OCI_HTYPE_SPOOL

OCI事务句柄

OCITrans

OCI_HTYPE_TRANS

OCI复杂对象检索(COR)句柄

OCIComplexObject

OCI_HTYPE_COMPLEXOBJECT

OCI线程句柄

OCIThreadHandle

不适用

OCI订阅句柄

OCISubscription

OCI_HTYPE_SUBSCRIPTION

OCI直接路径上下文句柄

OCIDirPathCtx

OCI_HTYPE_DIRPATH_CTX

OCI直接路径函数上下文句柄

OCIDirPathFuncCtx

OCI_HTYPE_DIRPATH_FN_CTX

OCI直接路径列数组句柄

OCIDirPathColArray

OCI_HTYPE_DIRPATH_COLUMN_ARRAY

OCI直接路径流句柄

OCIDirPathStream

OCI_HTYPE_DIRPATH_STREAM

OCI进程句柄

OCIProcess

OCI_HTYPE_PROC

OCI管理句柄

OCIAdmin

OCI_HTYPE_ADMIN

OCI HA 事件句柄

OCIEvent

不适用

3.3 分配和释放句柄

除了绑定、定义、线程句柄之外,其他句柄的分配都是针对一个特定环境句柄来说的。在执行分配句柄的调用时,需要将环境句柄作为参数之一传入,因此分配的句柄是特定于一个环境的。

绑定和定义句柄是特定于语句句柄分配的,其中包含语句句柄所代表的语句的一些信息。

绑定和定义局部由OCI库隐式地分配,不需要用户分配。

环境句柄由OCIEnvCreate()或OCIEnvNlsCreate()的调用完成分配和初始化。任何一个OCI应用都需要用到这两个函数中的一个。

所有用户分配的句柄的初始化都通过调用OCI句柄分配函数OCIHandleAlloc()来完成。

句柄的类型包括:会话池句柄,直接路径上下文句柄,线程句柄,COR句柄,订阅句柄,描述句柄,语句句柄,服务上下文句柄,错误句柄,服务器句柄,连接池句柄,HA事件句柄,管理句柄。

线程句柄通过OCIThreadHndInit()调用进行分配。

所有应用必须释放不再使用的句柄,释放句柄的通过OCIHandleFree()完成。

注意:

当一个母句柄释放,所有与其关联的子句柄都将一并释放并且不能再被使用。例如一个语句句柄被释放后,任何与其相关的绑定句柄和定义句柄都会一并释放。

句柄减少了对全局变量的需求,同时简化了错误报告,可以使用一个错误句柄来返回错误和诊断信息。

4、OCIServerAttach()连接方式demo

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <malloc.h>

#include "DCI.h"

/*   声明句柄 */

OCIEnv          *envhp;             /*   环境句柄            */

OCISvcCtx       *svchp;             /*   服务环境句柄          */

OCIServer       *srvhp;             /*   服务器句柄           */

OCISession      *authp;             /*   会话句柄            */

OCIStmt         *stmthp;            /*   语句句柄            */

OCIDescribe     *dschp;             /*   描述句柄            */

OCIError        *errhp;             /*   错误句柄            */

OCIDefine       *defhp[3];          /*   定义句柄            */

OCIBind         *bidhp [4];         /*   绑定句柄            */

sb2             ind[3];             /*   指示符变量           */

/*   绑定select结果集的参数            */

text            szpersonid[11];     /*   存储personid列 */

text            szsex[2];           /*   存储sex列 */

text            szname[51];         /*   存储name列         */

text            szemail[51];        /*   存储mail列         */

text            szphone[26];        /*   存储phone列        */

char            sql[256];           /*   存储执行的sql语句*/

int main(int argc, char *argv[])

{

     int errcno;

     char errbuf[512]= "";

     sb4 errcode;

     char strServerName[50];

     char strUserName[50];

     char strPassword[50];

     /*    设置服务器,用户名和密码                  */

     strcpy(strServerName,"localhost");

     strcpy(strUserName,"SYSDBA");

     strcpy(strPassword,"SYSDBA");

      /* 初始化OCI应用环境*/

      OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);

      /* 初始化环境句柄            */

      OCIEnvInit(&envhp, OCI_DEFAULT,0, 0);

      /*   分配句柄             */

      OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, 0, 0);              /*   服务器环境句柄  */

      OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, 0, 0);              /*   服务器句柄     */

      OCIHandleAlloc(envhp, (dvoid**)&authp, OCI_HTYPE_SESSION, 0, 0);            /*   会话句柄       */

      OCIHandleAlloc(envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, 0, 0);               /*   错误句柄       */

      OCIHandleAlloc(envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE,0,0);                   /*    描述符句柄    */

      /*   连接服务器    */

      OCIServerAttach(srvhp, errhp,(text *)strServerName, (sb4)strlen(strServerName),OCI_DEFAULT);

      /*   设置用户名和密码              */

      OCIAttrSet(authp,OCI_HTYPE_SESSION,(text *)strUserName,

           (ub4)strlen(strUserName),OCI_ATTR_USERNAME,errhp);

      OCIAttrSet(authp,OCI_HTYPE_SESSION,(text *)strPassword,

           (ub4)strlen(strPassword), OCI_ATTR_PASSWORD,errhp);

      /*   设置服务器环境句柄属性 */

      OCIAttrSet ((dvoid*)svchp, (ub4) OCI_HTYPE_SVCCTX,

           (dvoid*)srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp);

      OCIAttrSet(svchp, OCI_HTYPE_SVCCTX,(dvoid*)authp,

           0, OCI_ATTR_SESSION, errhp);

      /*   创建并开始一个用户会话 */

      OCISessionBegin (svchp, errhp, authp,OCI_CRED_RDBMS,OCI_DEFAULT);

      OCIHandleAlloc(envhp, (dvoid**)&stmthp,OCI_HTYPE_STMT, 0, 0);                /*   语句句柄 */

      /************************************************************************/

      //结束会话

      OCISessionEnd(svchp, errhp, authp, (ub4) 0);

      //断开与数据库的连接

      OCIServerDetach(srvhp, errhp, OCI_DEFAULT);

      //释放OCI句柄

      OCIHandleFree((dvoid*)dschp, OCI_HTYPE_DESCRIBE);

      OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT );

      OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR);

      OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION );

      OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX);

      OCIHandleFree((dvoid*)srvhp, OCI_HTYPE_SERVER);

      return 0;

 }

参考blog:https://www.cnblogs.com/Winnie-Z/articles/16264822.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DJ4-5 路由和选路

目录 一、路由与转发的相互作用 二、路由的基本概念 1. 默认路由器 2. 路由算法 三、网络的抽象模型 1. 节点图 2. 费用 Cost 四、路由算法分类 1. 静态路由算法 2. 动态路由算法 3. 全局路由算法 4. 分布式路由算法 一、路由与转发的相互作用 二、路由的基本概念 …

美团赴抖音之“约”:让本地生活补贴大战来得更猛烈些?

面对抖音在本地生活领域的强势挑战&#xff0c;美团似乎准备好了正面迎战。 近期&#xff0c;美团动作频频。最开始&#xff0c;美团在美团App美食页面下的“特价团购”打出“限时补贴&#xff0c;全网低价”的口号。对此&#xff0c;一位行业人士分析称&#xff0c;“之前美团…

java commons-io 工具类的使用

commons-io是第三方程序员编写的工具类&#xff0c;并不是java本身带的方法。是在java提供的工具类基础上&#xff0c;开发的工具类。简化了代码的用法&#xff0c;可以提升开发效率。 用法 1.下载jar包 2.在程序中新建lib目录&#xff0c;把jar包放进去 3.在jar包上右键&…

learn_C_deep_6 (布尔类型、布尔与“零值“、浮点型与“零值“、指针与“零值“的比较)

目录 语句和表达式的概念 if语句的多种语法结构 注释的便捷方法&#xff08;环境vs&#xff09; if语句执行的过程 逻辑与&& 逻辑或|| 运算关系的顺序 else的匹配原则 C语言有没有布尔类型 C99标准 sizeof(bool)的值为多少&#xff1f; _Bool原码 BOOL…

音视频八股文(6)-- ffmpeg大体介绍和内存模型

播放器框架 常用音视频术语 • 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 • 媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一 段声音…

dubbogo如何实现路由规则功能

dubbo-go中如何实现路由规则功能 路由规则&#xff08; routing rule &#xff09;是为了改变网络流量所经过的途径而修改路由信息的技术&#xff0c;主要通过改变路由属性&#xff08;包括可达性&#xff09;来实现。在发起一次 RPC 调用前起到过滤目标服务器地址的作用&…

Node第三方包 【node-xlsx】

文章目录 &#x1f31f;前言&#x1f31f;node-xlsx&#x1f31f;安装&#x1f31f;导出xlsx文件&#x1f31f;解析xlsx文件&#x1f31f;另外&#xff1a;其他支持读写Excel的Node.js模块有&#xff1a;&#x1f31f;直接导出excel文件 &#x1f31f;写在最后 &#x1f31f;前…

麒麟信安联合主办 | openEuler Developer Day 2023召开 openEuler全场景走向深入

【中国&#xff0c;上海&#xff0c;2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会、中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#xff0c;以“万涓汇流&#xff0c;奔涌向前”为主题&#…

【FTP工具】- Win10下免费的FTP服务器搭建 - FileZilla 的下载、安装、使用

目录 一、概述二、下载、安装2.1 下载2.2 安装 三、FileZilla服务器的使用3.1 连接服务器3.2 配置用户权限 四、在windows访问该Ftp服务器4.1 查看Ftp服务器IP4.2 访问Ftp服务器 一、概述 FileZilla服务器是一个免费的开源FTP和FTPS服务器&#xff0c;是根据GNU通用公共许可证条…

HTB靶机03-Shocker-WP

Shocker scan 2023-03-30 23:22 ┌──(xavier㉿xavier)-[~/Desktop/Inbox] └─$ sudo nmap -sSV -T4 -F 10.10.10.56 Starting Nmap 7.91 ( https://nmap.org ) at 2023-03-30 23:22 HKT Nmap scan report for 10.10.10.56 Host is up (0.40s latency). Not shown: 99 clos…

QT-day(2)-(常用类、信号与槽.....)

题目&#xff1a;编写一个登录功能的界面&#xff0c;在登录框项目中&#xff0c;将登陆按钮发射的tclicked信号&#xff0c;连接到自定义的槽函数中&#xff0c;在槽函数中&#xff0c;判断u界面输入的用户名是否为"admin ,密码是否为"123456如果验证成功&#xff0…

数据结构_时间复杂度/空间复杂度

目录 1. 数据结构在学什么 2. 数据结构的基本概念 3. 算法和算法评价 3.1 算法的基本概念 3.2 算法的特征 3.3 算法效率的度量 3.3.1 时间复杂度 3.3.2 空间复杂度 1. 数据结构在学什么 常言道&#xff1a;学以致用&#xff1b;学习完基本C语言程序&#xff0c;我们希…

AB数对 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 大致思路&#xff1a; 遍历输入的n个整数&#xff0c;将每个数存入哈希表中&#xff0c;key为数值&#xff0c;value为该数出现的次数。 再次遍历这n个整数&#xff0c;对于每个数x&#xff0c;计算出x-C和xC的值&#xff0…

Go语言基础----Go语言简介

【原文链接】Go语言基础----Go语言简介 一、Go语言简介 Go语言&#xff0c;又称Golang&#xff0c;是Google公司的Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson开发的一种静态强类型、编译型的语言。Go语言语法和C语言接近&#xff0c;但是功能上内存安全&#xff…

【Python】lambda匿名函数

文章目录 前言lambda匿名函数的定义lambda匿名函数的使用使用lambda匿名函数写一个计算器总结 前言 在Python中,可以使用def 关键字定义函数,使用def定义的关键字是有名称的,在调用时可以重复使用.还有一种是使用lambda关键字进行函数的定义,这个方式定义的函数是匿名函数,只能…

51单片机(四)静态数码管和动态数码管显示

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

内存优化-比glibc更快的tcmalloc

TCMalloc 是 Google 开发的内存分配器&#xff0c;在不少项目中都有使用&#xff0c;例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征&#xff1a;对抗内存碎片、在多核处理器能够 scale。据称&#xff0c;它的内存分配速度是 glibc2.3 中实…

3d网上渲染平台是怎么渲图的_云渲染流程详解!

题主说的看到许多网友对‘’3d网上渲染平台是怎么渲图的‘’进行提问&#xff0c;瑞云渲染小编也提供自己的小小见解。针对3D网上渲染平台是指什么&#xff0c;实际应该是指云渲染农场。几十年来&#xff0c;随着计算机软硬件不断更迭&#xff0c;图形图像渲染的效果更加清晰、…

信号完整性分析基础知识之传输线和反射(二):阻性负载的反射,源端阻抗,弹跳图

传输线的端接需要考虑三种重要的特殊情况&#xff0c;每种情况中&#xff0c;传输线的特性阻抗均为50Ohm。信号将从源端在这条传输线上传播&#xff0c;并以特定的阻抗端接到达远端。 TIP:在时域中&#xff0c;信号对瞬时阻抗十分敏感&#xff0c;第二区域并不一定是一条传输线…

常见的链表的OJ题

在本次的博客当中&#xff0c;为了巩固关于链表技能的运用&#xff0c;我们先来看一些与链表有关的OJ题。 &#x1f335;反转链表 题目详情如下&#xff1a; 第一道题目从逻辑上看不难&#xff0c;我们只需要将链表进行拆分&#xff0c;将我们下一个节点进行一个类似于头插的操…