簡體   English   中英

在多進程系統中使用SQLAllocHandle(SQL_HANDLE_ENV,…)

[英]Use of SQLAllocHandle(SQL_HANDLE_ENV, …) in a multi-process system

我想確保在多進程系統中正確實現連接。 具體來說,環境句柄。

SQLAllocHandle似乎已被多家數據庫供應商使用。 我的直接興趣是DB2,但是我也想知道其他供應商如何處理它。

我在網上找到的示例分配了環境句柄,然后立即分配了數據庫句柄。 我認為這些示例是針對單個流程系統的,因此在這種情況下它們是有意義的。 像這樣的代碼:

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();
       }
   }
}

這對我來說似乎更有意義(即使速度不是更快),但是我在網上沒有找到示例。

那是正確的方法嗎? 還有其他更好的技術嗎?

我發現的用於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. 使用子語言環境線程1連接到數據庫A,並使用SQLFetch()將數據從該連接讀取到共享的應用程序緩沖區中。
  3. 使用子語言環境線程2連接到數據庫B。子語言環境線程2同時從共享應用程序緩沖區讀取數據,並將此數據插入數據庫B。
  4. 調用Pthread函數以同步每個子線程中共享應用程序緩沖區的使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM