life?is?short?,?play?more!
分类: Oracle
2008-11-28 10:35:11
程序架构(OCI Program structure)
OCI应用程序最主要的目的是面向多用户的。
OCI用户使用一下基本的程序架构
1. 初始化OCI环境和线程
2. 分配必要的句柄建立服务器连接和用户的会话连接
3. 通过执行sql命令与数据库服务器进行数据交换,并执行相关的应用程序数据处理
4. 执行预备的命令或为下一次执行命令的预备
5. 终结用户的会话和服务器连接
6. 释放句柄资源
此图现实程序流程
有可能在实际的开发中与此图实际的过程有所不同,这取决于你的程序的不同实现的功能。例如你需要一些其他的专业的功能,例如多会话管理与事务管理或者使用对象等,都需要额外的步骤。
所有的OCI功能调用都是在一个环境上下文调用的。一个OCI进程可以有多个环境上下文,如果一个环境需要任何进程级别的初始化,那么他将自动运作。
注意: 在一个OCI程序中,有多个活动的数据库连接或者数据库命令都是可能的。
OCI 数据结构(OCI Data Structure)
句柄和描述符是非常难于理解的数据结构,他们在OCI里有定义。他们可以被直接分配通过指定的分配调用,或者他们可以被OCI的函数隐式分配。
句柄和描述符存储的信息与数据,连接或程序的行为有关。
句柄(Handles)
几乎所有的OCI 调用都会包含一个或多个的句柄参数。一个句柄就是被OCI 库分配指定的一个指针,他指向一块存储的区域。你可以用句柄来保存上下文和连接信息等。(例如,一个环境或者服务上下文句柄)或者他存储的信息是OCI函数或者数据等(例如一个错误句柄或者描述句柄)。句柄可以使程序来维持数据更简单,库提供的这些远远要比你自己实现容易。
大多数OCI 程序需要访问存储在句柄中的信息,设定和获取属性OCI调用,OCIAttrGet()
和OCIAttrSet()
,可以访问设定此信息。
如下列出了OCI句柄的定义。
Description C Datatype Handle Type
OCI environment handle OCIEnv OCI_HTYPE_ENV
OCI error handle OCIError OCI_HTYPE_ERROR
OCI service context handle OCISvcCtx OCI_HTYPE_SVCCTX
OCI statement handle OCIStmt OCI_HTYPE_STMT
OCI bind handle OCIBind OCI_HTYPE_BIND
OCI define handle OCIDefine OCI_HTYPE_DEFINE
OCI describe handle OCIDescribe OCI_HTYPE_DESCRIBE
OCI server handle OCIServer OCI_HTYPE_SERVER
OCI user session handle OCISession OCI_HTYPE_SESSION
OCI authentication information handle OCIAuthInfo OCI_HTYPE_AUTHINFO
OCI connection pool handle OCICPool OCI_HTYPE_CPOOL
OCI session pool handle OCISPool OCI_HTYPE_SPOOL
OCI transaction handle OCITrans OCI_HTYPE_TRANS
OCI complex object retrieval (COR) handle OCIComplexObject OCI_HTYPE_COMPLEXOBJECT
OCI thread handle OCIThreadHandle N/A
OCI subscription handle OCISubscription OCI_HTYPE_SUBSCRIPTION
OCI direct path context handle OCIDirPathCtx OCI_HTYPE_DIRPATH_CTX
OCI direct path function context handle OCIDirPathFuncCtx OCI_HTYPE_DIRPATH_FN_CTX
OCI direct path column array handle OCIDirPathColArray OCI_HTYPE_DIRPATH_COLUMN_ARRAY
OCI direct path stream handle OCIDirPathStream OCI_HTYPE_DIRPATH_STREAM
OCI process handle OCIProcess OCI_HTYPE_PROCESS
分配和释放句柄(allocating and freeing handles)
你的程序需要为相应的环境句柄分配所有的句柄(除了bind,define和 thread 句柄)。一般环境句柄作会为分配句柄的参数。那么这样的话,则分配的句柄则将与指定的那个环境句柄关联起来。
bind 和 define 句柄是用来和命令句柄相关的,而且包含一些信息关于命令解析。
注意: bind和define是被oci库在运行某些函数时被自动调用的,不需要用户手动分配。
以下是句柄的层次图
环境句柄被分配和初始化的是一个叫 OCIEnvCreate() 或者 OCIEnvNlsCreate() 其中之一是OCI程序必须需要的(因为一个环境句柄的分配是所有程序所必须的)。所有用户可分配的句柄是用OCI句柄分配调用来进行初始化分配的(OCIHanleAlloc())。
一个应用程序必须释放所有的句柄当他们不在被使用时。释放的函数调用是OCIHandleFree()。
注意:当以个父层的句柄被释放,所有他的子句柄都会将被释放。例如,当一个命令句柄释放,则关联于他的bind和define句柄也将被释放。
错误异常句柄也是非常重要的。它可以手机错误的报告更容易,用来方便查找错误。
介绍几个句柄:
服务上下文和交互句柄(service context and associated handles)
顾名思义是用来建立与服务器连接并交互的句柄。服务器上下文包括3个句柄作为它的属性,服务器连接,用户会话,事务。
句柄属性
所有的OCI句柄都有属性,这些可以用来存放一些信息。有些OCI 函数需要那些指定的句柄属性被设定以后才能被调用。例如,当OCISessionBegin() 需要被调用的时候,用户名和密码需要在调用之前先设定。
还有一些OCI的函数在执行完毕之后,将返回的信息直接返回给某个句柄。比如当OCIStmtExecute() 执行一个sql查询后,查询的列表项信息将会返回到statement 句柄。
OCI 描述符
OCI 描述符和定位符是数据结构用来组织指定的数据信息。
Description C Datatype OCI Type Constant
snapshot descriptor OCISnapshot OCI_DTYPE_SNAP
LOB datatype locator OCILobLocator OCI_DTYPE_LOB
FILE datatype locator OCILobLocator OCI_DTYPE_FILE
read-only parameter descriptor OCIParam OCI_DTYPE_PARAM
ROWID descriptor OCIRowid OCI_DTYPE_ROWID
ANSI DATE descriptor OCIDateTime OCI_DTYPE_DATE
TIMESTAMP descriptor OCIDateTime OCI_DTYPE_TIMESTAMP
TIMESTAMP WITH TIME ZONE descriptor OCIDateTime OCI_DTYPE_TIMESTAMP_TZ
TIMESTAMP WITH LOCAL TIME ZONE descriptor OCIDateTime OCI_DTYPE_TIMESTAMP_LTZ
INTERVAL YEAR TO MONTH descriptor OCIInterval OCI_DTYPE_INTERVAL_YM
INTERVAL DAY TO SECOND descriptor OCIInterval OCI_DTYPE_INTERVAL_DS
complex object descriptor OCIComplexObjectComp OCI_DTYPE_COMPLEXOBJECTCOMP
advanced queuing enqueue options OCIAQEnqOptions OCI_DTYPE_AQENQ_OPTIONS
advanced queuing dequeue options OCIAQDeqOptions OCI_DTYPE_AQDEQ_OPTIONS
advanced queuing message properties OCIAQMsgProperties OCI_DTYPE_AQMSG_PROPERTIES
advanced queuing agent OCIAQAgent OCI_DTYPE_AQAGENT
advanced queuing notification OCIAQNotify OCI_DTYPE_AQNFY
the distinguished names of the database servers in a registration request
OCIServerDNs OCI_DTYPE_SRVDN
每个描述符的类型的作用如下
· OCISnapshot - used in statement execution
· OCILOBLocator - used for LOB (OCI_DTYPE_LOB) or FILE (OCI_DTYPE_FILE) calls
· OCIParam - used in describe calls
· OCIRowid - used for binding or defining ROWID values
· OCIDateTime and OCIInterval - used for datetime and interval datatypes
· OCIComplexObjectComp - used for complex object retrieval
· OCIAQEnqOptions, OCIAQDeqOptions, OCIAQMsgProperties, OCIAQAgent - used for Advanced Queuing
· OCIAQNotify - used for publish-subscribe notification
· OCIServerDNs - used for LDAP-based publish-subscribe notification