在多进程系统中使用SQLAllocHandle(SQL_HANDLE_ENV,...)

时间:2014-07-12 02:20:08

标签: c db2 odbc

我想确保我在多进程系统中正确实现连接。 具体来说,环境处理。

SQLAllocHandle似乎被多个数据库供应商使用。我的兴趣在于DB2,但我也想知道其他供应商如何处理它。

我在Web上找到的示例分配环境句柄,然后立即分配数据库句柄。 我假设这些例子是针对单个过程系统的,所以在这种情况下它们是有意义的。 像这样的代码:

SQLHANDLE connenv = NULL;
SQLHANDLE conn = NULL;

int connectEnv(void)
{
   connenv = NULL;
   if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &connenv))
   {
      printf("Fail to allocate memory for connenv");
      return 0;
   }

   return 1;
}

int connectDbc(void)
{
   conn = NULL;

   if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, connenv, &conn))
   {
      SQLFreeHandle(SQL_HANDLE_ENV, connenv);
      printf("Fail to connect to database");
      return 0;
   }

   if (SQL_SUCCESS != SQLConnect(conn, conninfo, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS))
   {
      printf("unable to allocate connection %s", conninfo);
      return 0;
   }
   return 1;
}

int main(int argc, char *argv[]) {
   while (1) {
       waitForReasonToStartChild()
       if (fork()) {
          // parent process

       } else {
          // child process
          connectEnv();
          connectDbc();
       }
   }
}

为了节省时间,我想将环境句柄的分配移动到父进程,并将数据库连接保留在子进程中。

int main(int argc, char *argv[]) {
   connectEnv();
   while (1) {
       waitForReasonToStartChild()
       if (fork()) {
          // parent process

       } else {
          // child process
          connectDbc();
       }
   }
}

这似乎对我来说更有意义(即使它不是更快),但我没有在网上找到例子。

这是正确的方法吗? 还有其他更好的技术吗?

1 个答案:

答案 0 :(得分:0)

我发现DB2 ODBC的多线程的第一个链接有一个像你喜欢的方法的例子。

链接为http://www-01.ibm.com/support/knowledgecenter/api/content/SSEPEK_11.0.0/com.ibm.db2z11.doc.odbc/src/tpc/db2z_lethrd.html

总而言之,父线程分配环境,然后每个子线程(在所示示例中为两个)分配自己的连接句柄并使用它:

  
      
  1. 从初始父线程创建两个子语言环境线程。父线程在持续时间内保持活动状态   孩子的线程。 DB2 ODBC要求建立的线程   环境句柄必须持续一段时间   应用。该线程的持久性保留了DB2语言   驻留在语言环境中的接口例程。
  2.   
  3. 使用子语言环境线程1连接到数据库A,并使用SQLFetch()将此连接中的数据读入共享   应用程序缓冲区。
  4.   
  5. 使用子语言环境线程2连接到数据库B.子语言环境线程2同时从中读取数据   共享应用程序缓冲区并将此数据插入数据库B。
  6.   
  7. 调用Pthread函数以同步每个子线程中共享应用程序缓冲区的使用。
  8.