句柄管理

句柄类型

句柄

句柄本质是一个结构,结构的成员被ACI隐藏,开发者不需要关心句柄结构中具体成员,因此句柄的内存分配和释放只能通过ACI接口进行。ACI支持的句柄如下:

句柄类型 C语言类型 描述 父句柄 神通支持情况
ACI_HTYPE_ENV ACIEnv 环境句柄 支持
ACI_HTYPE_ERROR ACIError 错误句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_SVCCTX ACISvcCtx 服务上下文句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_STMT ACIStmt 语句句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_BIND ACIBind 绑定句柄 ACI_HTYPE_STMT 支持
ACI_HTYPE_DEFINE ACIDefine 定义句柄 ACI_HTYPE_STMT 支持
ACI_HTYPE_DESCRIBE ACIDescribe 描述句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_SERVER ACIServer 服务器句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_SESSION ACISession 会话句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_CPOOL ACICPool 连接池句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_SPOOL ACISPool 会话池句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_AUTHINFO ACIAuthInfo 认证信息句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_BULKIMP ACIHIMP MPP数据加载句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_BULK ACIBulk 数据库加载句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_DIRPATH_CTX ACIDirPathCtx 直接路径加载上下文句柄 ACI_HTYPE_ENV 支持
ACI_HTYPE_DIRPATH_COLUMN_ARRAY ACIDirPathColArray 直接路径加载列数组句柄 ACI_HTYPE_DIRPATH_CTX 支持
ACI_HTYPE_DIRPATH_STREAM ACIDirPathStream 直接路径加载流句柄 ACI_HTYPE_DIRPATH_CTX 支持
ACI_HTYPE_TRANS ACITrans 事务句柄 ACI_HTYPE_ENV 支持

ACI接口的句柄和描述符等数据结构需要指定的函数来分配,有些句柄是在函数调用中显式分配的,有一些结构是隐式分配的:

使用大部分句柄时需要显式分配 ACIHandleAlloc ,同时需要显式释放 ACIHandleFree ;而ACI_HTYPE_BIND和ACI_HTYPE_DEFINE这两种句柄,是隐式分配的,使用者不需要关心句柄结构的内存申请和释放。

上下文句柄及关联

ACI_HTYPE_SVCCTX上下文句柄用于与数据库服务端进行操作所需,它包含三个句柄,分别为:ACI_HTYPE_SERVER和ACI_HTYPE_SESSION及ACI_HTYPE_TRANS。

../../../../_images/image97.png

服务器句柄标识与数据库的物理网络连接,用于数据的网络传输;

用户句柄:定义用户的角色和权限;

事务句柄:定义在其中执行SQL操作的事务。

语句,绑定,定义句柄及关联

语句句柄是执行SQL或PL / SQL语句及其关联属性的结构,包含SQL参数信息、描述信息、结果集信息等,包含定义句柄和绑定句柄:

../../../../_images/image1012.png

绑定句柄:存储输入(参数)和输出(out 参数)类型变量的绑定变量信息;ACI在调用 ACIBindByNameACIBindByPos 为SQL语句中每个占位符分配一个绑定句柄;用户不得分配绑定句柄,它们由bind调用隐式分配。

定义句柄:根据绑定的变量类型,从查询结果中将数据转换到绑定变量中。 ACI库为使用 ACIDefineByPosACIDefineByPos2 定义的每个输出变量分配一个定义句柄,用户不得分配定义句柄,它们由define调用隐式分配。

显式分配绑定或定义句柄可能会导致内存泄漏。显式释放绑定或定义句柄可能会导致程序异常终止。

连接池句柄及关联

连接池句柄用于通过调用ACI函数将物理连接池化为虚拟连接的应用程序。通过连接池,可设置连接池的最小值,最大值、增长值等内容。

直接路径加载句柄及关联

直接路径加载句柄是实现快速加载必备的句柄,直接路径加载接口使应用程序可以快速的访问数据库。直接路径加载句柄依赖以下三个句柄:

../../../../_images/image1110.png

描述符

描述符主要用于复杂数据类型的存储和处理,神通数据库目前支持的句柄如下:

句柄类型 C语言类型 描述 父句柄
ACI_DTYPE_DATE ACIDateTime 时间日期描述符 ACI_HTYPE_ENV
ACI_DTYPE_TIMESTAMP ACIDateTime 时间戳描述符 ACI_HTYPE_ENV
ACI_DTYPE_TIMESTAMP_TZ ACIDateTime 带时区的时间戳描述符 ACI_HTYPE_ENV
ACI_DTYPE_TIMESTAMP_LTZ ACIDateTime 本地时区的时间戳描述符 ACI_HTYPE_ENV
ACI_DTYPE_INTERVAL_YM ACIInterval YM时间间隔描述符 ACI_HTYPE_ENV
ACI_DTYPE_INTERVAL_DS ACIInterval DS时间间隔描述符 ACI_HTYPE_ENV
ACI_DTYPE_LOB ACILobLocator 大对象描述符 ACI_HTYPE_ENV
ACI_DTYPE_FILE ACILobLocator bfile文件描述符 ACI_HTYPE_ENV
ACI_DTYPE_PARAM ACIParam 参数描述符
ACI_DTYPE_JSON ACIJson Json描述符 ACI_HTYPE_ENV
ACI_DTYPE_ROWID ACIRowid Rowid描述符 ACI_HTYPE_ENV

LOB和BFILE描述符

大对象(LOB)是一种神通数据库的数据类型,可以保存二进制大对象(BLOB)或字符大对象(CLOB)数据。在数据库中,LOB的地址称为定位器存储在数据库行的LOB列中,或存储在对象的LOB属性中。定位器充当指向实际LOB值的指针,该LOB值存储在单独的位置。ACI中的LOB和BFILE描述符用于存储lob的定位器,用户lob数据的操作。

ACI LOB定位器用于对LOB(BLOB或CLOB)或FILE(BFILE)执行ACI操作。 ACILobXXX函数采用LOB定位器参数而不是LOB值。 ACI LOB函数不使用实际的LOB数据作为参数。 他们将LOB定位器用作参数,并对它们引用的LOB数据进行操作。

通过传递ACI_DTYPE_LOB作为BLOB或CLOB的类型参数,传递ACI_DTYPE_FILE作为BFILE的LOB定位器,可以调用 ACIDescriptorAlloc

备注:根据您的应用程序,您可以为CLOB列绑定或定义字符数据,或者为BLOB列绑定或定义RAW数据,不一定用定位器的方式来操作大对象。

参数描述符

ACI应用程序使用参数描述符获取有关选择列表列或架构对象的信息。此信息是通过describe操作获得的。

参数描述符是唯一不使用 ACIDescriptorAlloc 分配的描述符类型。通过使用 ACIParamGet 调用从ACI_HTYPE_DESCRIBE描述句柄中获得指定位置的参数。

时间相关描述符

date,datetime、timestap、和interval描述符由使用日期,日期时间或间隔数据类型(ACIDate,ACIDateTime和ACIInterval)的应用程序使用。 这些描述符可用于绑定和定义,并作为参数传递给函数 ACIDescriptorAllocACIDescriptorFree 以分配和释放内存。

句柄申请

  • 句柄的分配

ACI_HTYPE_ENV类型的句柄申请有两种方式:

  1. ACIEnvInit ,淘汰方式,不推荐使用
  2. ACIEnvCreate 或者 ACIEnvNlsCreate ,这是推荐使用的方式

其他父句柄类型为ACI_HTYPE_ENV的,都是通过 ACIHandleAlloc 进行申请的。

ACI_HTYPE_ERROR错误句柄时大部分接口调用所需,因此,ACI_HTYPE_ERROR的分配应该是在ACI_HTYPE_ENV分配后立即要做的事情。

  • 描述符分配

描述符的申请方式为:通过 ACIDescriptorAlloc / ACIArrayDescriptorAlloc 分配;

句柄释放

显示申请的句柄的释放都是通过 ACIHandleFree 来进行释放的;描述符通过 ACIDescriptorFree / ACIArrayDescriptorFree 进行释放。

备注1:良好的编程习惯是句柄或描述符在需要的时候申请,不需要的时候及时释放,否则会导致内存泄漏;

备注2:父句柄的释放会自动释放子句柄,但不要完全依赖这种机制,按照”备注1”描述的规范编写;

备注3:隐式句柄不需要在应用程序中释放;由其所属父句柄释放时自动释放。

句柄属性设置

所有ACI句柄都有代表存储在该句柄中的数据的一些属性。您可以使用 ACIAttrGet 来读取句柄属性,也可以使用 ACIAttrSet 来更改属性。

示例代码:使用ACI_ATTR_USERNAME属性在会话句柄中设置用户名

text username[] = "hr";
err = ACIAttrSet ((void *) mysessp, ACI_HTYPE_SESSION, (void *)username,
    (ub4) strlen((char *)username), ACI_ATTR_USERNAME, (ACIError *) myerrhp);

某些ACI函数要求在调用函数之前设置特定的句柄属性。 例如,当调用 ACISessionBegin 建立用户的登录会话时,必须在用户会话句柄中设置用户名和密码,然后才能进行调用。

其他ACI函数在函数执行完成后在句柄属性中提供有用的返回数据。 例如,当调用 ACIStmtExecute 执行SQL查询时,在语句句柄中返回与选择列表项有关的描述信息。例如:在语句句柄中返回与选择列表项有关的描述信息

ub4 parmcnt;
/* 获得查询列的个数*/
err = ACIAttrGet ((void  *)stmhp, (ub4)ACI_HTYPE_STMT, (void  *)
       &parmcnt, (ub4 *) 0, (ub4)ACI_ATTR_PARAM_COUNT, errhp);