ODBC API不能释放Oracle数据库连接

来源:互联网 发布:1415赛季nba总决赛数据 编辑:程序博客网 时间:2024/05/30 21:58

ODBC API打开数据库连接,一般用: SQLDriverConnect

关闭数据库连接用: SQLDisconnect

 

但是要精细控制,需要设置连接数据库HANDLE的属性,比如比较普通的有版本号,超时时间等等。

最近编程发现,用关闭数据库还不能释放。看样子是释放成功了,但用Oracle的管理工具看,或者看v$session表,发现连接还存在,状态是INACTIVE

 

怎么办?

 

打开ODBC的跟踪器,运行单元测试程序xisql测试,看LOG,发现有打印:

xisql  be4-cd4 ENTER SQLSetEnvAttr
  SQLHENV             00000000
  SQLINTEGER                 201 <unknown>
  SQLPOINTER          [Unknown attribute 201]
  SQLINTEGER                   0
看看这个unknown参数是什么?原来是: SQL_ATTR_CONNECTION_POOLING, 也就是给ODBC环境加了缓冲池。

 

不调用这个,可以正常释放。

 

但是,用复杂的服务程序,发现还是释放不了,看LOG,有:

vwserver  d24-8ac EXIT  SQLDisconnect  with return code -1 (SQL_ERROR)
  HDBC                00AA1758

  DIAG [25000] [Oracle][ODBC]Invalid transaction state. (0)
看样子是事务没有释放,就调用: SQLEndTran, 然后再释放吧,ok了。

 

为什么呢?

因为服务程序的数据库连接都用: SQLSetConnectAttr, 将连接属性设置成不自动提交的。而简单的单元测试程序缺省就是每执行完一条语句就立即提交的。

 

看来Oracle数据库在释放之前,不管你是否用了数据库修改,就是只调用SELECT语句,调用一下结束事务也是必要的。

原创粉丝点击