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语句,调用一下结束事务也是必要的。