我想确保我在多进程系统中正确实现连接。 具体来说,环境处理。
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();
}
}
}
这似乎对我来说更有意义(即使它不是更快),但我没有在网上找到例子。
这是正确的方法吗? 还有其他更好的技术吗?
答案 0 :(得分:0)
我发现DB2 ODBC的多线程的第一个链接有一个像你喜欢的方法的例子。
总而言之,父线程分配环境,然后每个子线程(在所示示例中为两个)分配自己的连接句柄并使用它:
- 从初始父线程创建两个子语言环境线程。父线程在持续时间内保持活动状态 孩子的线程。 DB2 ODBC要求建立的线程 环境句柄必须持续一段时间 应用。该线程的持久性保留了DB2语言 驻留在语言环境中的接口例程。
- 使用子语言环境线程1连接到数据库A,并使用SQLFetch()将此连接中的数据读入共享 应用程序缓冲区。
- 使用子语言环境线程2连接到数据库B.子语言环境线程2同时从中读取数据 共享应用程序缓冲区并将此数据插入数据库B。
- 调用Pthread函数以同步每个子线程中共享应用程序缓冲区的使用。
醇>