Sql server SQL Server:ODBC连接池/C API

Sql server SQL Server:ODBC连接池/C API,sql-server,c,odbc,connection-pooling,Sql Server,C,Odbc,Connection Pooling,我想澄清如何从C使用SQL Server进行连接池。我知道这个问题就像。。。。1998年,但是。。。我从来没有用过C,所以。。。下面是: 首先,我认为我必须设置属性以启用池: rc = SQLSetEnvAttr( NULL, // make process level cursor pooling SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER)SQL_CP_ONE_PER_DR

我想澄清如何从C使用SQL Server进行连接池。我知道这个问题就像。。。。1998年,但是。。。我从来没有用过C,所以。。。下面是:

首先,我认为我必须设置属性以启用池:

rc = SQLSetEnvAttr( NULL,  // make process level cursor pooling
                    SQL_ATTR_CONNECTION_POOLING,
                    (SQLPOINTER)SQL_CP_ONE_PER_DRIVER,
                    SQL_IS_INTEGER);
然后分配HENV并将其设置为ODBC3.0:

rc = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv1);
rc = SQLSetEnvAttr(henv1, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);

问题

  • 我可以在一个进程内的多个并发线程中使用上面分配的HENV,就像我调用SQLAllocHandle来分配db连接(HDBC)一样,这是正确的吗

  • 当我想使用池中的连接时,典型的顺序是:

  • SQLAllocHandle获取连接句柄(HDBC)
  • SQLDriverConnect/[SQLConnect以连接该句柄
  • SQLExecute/SQLExecDirect+一系列SQLFetch,用于连接
  • SQLDisconnect
  • SQLFreeConnect

  • 如果我保存分配的HDBC句柄,并在多个SqlDriverConnection+SQLDisconnect调用中重复使用它,是否有显著的延迟优势?换句话说,对于每次使用连接,我都会跳过步骤2.1和2.5。或者步骤2.1和2.5基本上只是malloc/free?(在这种情况下,我不在乎)

  • 在这个特定的场景中,C应用程序可能是唯一一个从此框访问SQL Server的应用程序。但它将在IIS环境中运行,这意味着它可能是多进程的,每个进程都是多线程的


    我将在HTTP请求的范围内获取和使用该连接,因此我希望它尽可能快、高效和可扩展。

    我想最后一个知道答案的人是在2008年底退休的:)哈,我知道,就像我说的,Sooo 1998。但是PHP、Ruby和其他环境的驱动程序是在这个基于C的ODBC层上实现的。ODBC仍然被大量使用,非常快速,高效。你看过了吗?我完全同意ODBC围绕ADO.Net编程模型运行。但正是什么让它快速,也让它难以使用。SQLBindParameter,SQLBindCol,不完全是一个外行程序员的喜悦。。。