gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:31:16 24 4
gpt4 key购买 nike

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

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. Creates two child Language Environment threads from an initial parent thread. The parent thread remains active for the duration of the child threads. DB2 ODBC requires that the thread that establishes the environment handle must persist for the duration of the application. The persistence of this thread keeps DB2 language interface routines resident in the Language Environment enclave.
  2. Connects to database A with child Language Environment thread 1 and uses SQLFetch() to read data from this connection into a shared application buffer.
  3. Connects to database B with child Language Environment thread 2. Child Language Environment thread 2 concurrently reads data from the shared application buffer and inserts this data into database B.
  4. Calls Pthread functions to synchronize the use of the shared application buffer within each of the child threads.

关于c - 在多进程系统中使用 SQLAllocHandle(SQL_HANDLE_ENV, ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com