我有个项目是用动态链接库访问数据库的,动态链接库需要被多线程调用,程序前段时间已经做完了(用BDE连接数据库),现正在试用着,但我有点不放心,怕我先前采用的方法不能很好的支持多线程(100个以上),现在想用Pro *C再做一个,想请教一下:
1、数据库是Oracle 9i的,但客户端是Oracle 7的(客户端是别人的机器,不敢轻易改动),在使用Pro *C写程序时,是否还要自己考虑线程方面的问题?
2、Pro *C和Pro *C++比起来有差别吗?程序体积、可靠性方面?

解决方案 »

  1.   

    这个问题的关键是sqlca通讯区共享冲突做成的,解决的办法有两种:其一,申请两个sqlca通讯区,每个操作用其中的一个通讯区;其二,加一个互斥对象,两个操作过程互斥,否则会造成共享冲突....
    第一种作法是:
    EXEC SQL ENABLE THREADS;
    对多线程环境进行初始化,
    其次,要建立sqlca会话环境,你需要调用
    EXEC SQL CONTEXT ALLOCATE ctxName来初始化所有的sqlca环境,
    然后在调用任何pl/sql or sql语句前用
    EXEC SQL CONTEXT USE ctxName来绑定sqlca环境,如果你只建立了一个sqlca,就必须使用互斥,否则出错将会是oracle的一个定时炸弹。
    在程序退出时记住要释放sqlca环境变量,否则可能会引起其它副作用...
      

  2.   

    看来用Pro *C的实现也很麻烦,其实用你提到的后一个方法是比较简单的,即
    把所有线程的数据库访问串行化,让它们排者队来处理,这样做绝对安全,但
    效率恐怕不好。我想向数据库里插50万条记录,来试一下完成一个任务需要
    多少时间,如果不超过0.1秒的话可以考虑采用后一种方法。