- 论坛徽章:
- 0
|
我的应用程序是如下结构:
main.c 程序的逻辑流程
mydb.pc 包含对数据库表访问的函数,所有的SQL语句封装到函数中,便于在main.c中使用。
例如
XXX_connect(),XXX_disconnect(),
XXX_insert_table1(),XXX_insert_table2(),
XXX_delete_table1(),XXX_delete_table2()等。
main.c中主程序如下:
main()
{
XXX_connect(...);
while(1)
{
reqid=RecvRequest(...);
switch(reqid)
{
INS_TABLE1_REQ: XXX_insert_table1(...);
break;
INS_TABLE2_REQ: XXX_insert_table2(...);
break;
DEL_TABLE1_REQ: XXX_delete_table1(...);
break;
DEL_TABLE2_REQ: XXX_delete_table2(...);
break;
default:
}
SendResponse();
}
}
在单进程情况下,程序运行正常。后来需要将上面的程序改为多线程。我在主进程
中调用一次XXX_connect,在子线程中访问数据库,在访问数据库函数的前后我增加
了互斥锁,保证同一时间只有一个线程访问数据库。
但是这又出现一个问题,子线程对数据库的访问报错“未登录”。
这样只有两种方法了:
1,每个子线程都调用一次XXX_connect()、XXX_disconnect(),但是我觉得这样肯定效率很低。
2,查找资料,看到可以用ProC的
EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :envtext;
EXEC SQL CONTEXT USE :envtext;
我在mydb.pc中将envtext作为全局变量,然后每个函数加一句EXEC SQL CONTEXT USE :envtext;
仍然报错“未登录”。看到资料上的说法是将envtext作为参数传入每个数据库访问函数,
即XXX_insert_table1(envtext,...),问题在于XXX_insert_table1()是在main.c中调用,c文件
中无法定义sql_context类型的变量。资料上proC的多线程作法完全是把业务逻辑写在pc文件中的,
跟我的应用有所不同,我的应用是把逻辑写在c文件中的。
请问我应该如何实现子线程对数据库的连接呢?
程序与数据库的连接是相当于一个会话吗?子进程无法使用该连接吗?
谢谢。 |
|