Skip to content

数据库连接断开与释放

在应用完成对数据库的操作后,需进行断开连接和释放资源操作。如连接使用后不与服务端断开,则会影响其它新建连接服务。如客户端申请资源不释放则会影响应用后续资源申请。连接的释放对于应用的长期稳定运行有极重要的作用。

频繁的建连接,旧资源得不到释放,将极大地影响后续应用的使用体验。连接的释放主要分为以下步骤:

  • 在有语句句柄的情况下先释放语句句柄
  • 断开连接
  • 释放连接句柄
  • 释放环境句柄

操作流程图如图1所示。


此段程序的C代码示例如下:

c
#include <windows.h> 
#include <sql.h> 
#include <sqltypes.h> 
#include <sqlext.h> 
/* 检测返回代码是否为成功标志,当为成功标志返回 TRUE,否则返回 FALSE */ 
#define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO) 
/* 检测返回代码是否为失败标志,当为失败标志返回 TRUE,否则返回 FALSE */ 
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc))) 

void main(void) 
{ 
    SQLHENV henv;   /* 环境句柄 */ 
    SQLHDBC hdbc;   /* 连接句柄 */ 
    SQLHSTMT hstmt; /* 语句句柄 */ 
    SQLRETURN ret;  /* 返回代码 */ 
    SQLINTEGER autocommit_mode; 

    /* 申请一个环境句柄 */ 
    SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); 
    /* 设置环境句柄的 ODBC 版本 */ 
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); 
    /* 申请一个连接句柄 */ 
    SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    ret = SQLConnect(hdbc, (SQLCHAR *)"XuguDB", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS); 
    if (RC_NOTSUCCESSFUL(ret)) { 
        /* 连接数据源失败! */ 
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
        SQLFreeHandle(SQL_HANDLE_ENV, henv); 
        return;
    } 
    /* 设置连接句柄属性,关闭自动提交功能 */ 
    SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER); 
    /* 取得连接句柄属性,取得提交的模式 */ 
    SQLGetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)&autocommit_mode, sizeof(SQLINTEGER), NULL); 
    /* 申请一个语句句柄 */ 
    SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    ...在这里可以使用语句句柄进行相应的数据库操作...
    /* 释放语句句柄 */ 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt); 
    /* 提交连接上的事务 */ 
    SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); 
    /* 断开与数据源之间的连接 */ 
    SQLDisconnect(hdbc); 
    /* 释放连接句柄 */ 
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
    /* 释放环境句柄 */ 
    SQLFreeHandle(SQL_HANDLE_ENV, henv); 
}