[英]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多線程的第一個鏈接有一個示例,如您的首選方法。
總而言之,父線程分配環境,然后每個子線程(在所示示例中為兩個)分配自己的連接句柄並使用它:
- 從初始父線程創建兩個子語言環境線程。 父線程在子線程期間保持活動狀態。 DB2 ODBC要求建立環境句柄的線程必須在應用程序期間持續存在。 該線程的持久性使DB2語言接口例程駐留在語言環境中。
- 使用子語言環境線程1連接到數據庫A,並使用SQLFetch()將數據從該連接讀取到共享的應用程序緩沖區中。
- 使用子語言環境線程2連接到數據庫B。子語言環境線程2同時從共享應用程序緩沖區讀取數據,並將此數據插入數據庫B。
- 調用Pthread函數以同步每個子線程中共享應用程序緩沖區的使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.