proc程序,单线程转多线程的方案问题,非高莫入,谢谢公司做项目,把以前unix或openvms下的过程控制系统移植到windows 2000下。以前的系统是多进程的,没有用多线程。现在移到win2k,考虑用多进程多线程实现。现在程序都已经写完,模块测试业已完成,进入整体测试,结果程序出问题了,崩溃了。崩溃是随机出现的,可能运行好几天没问题,亦可能两小时就有问题。后来查proc的编程手册,发现问题出在proc程序访问oracle。多线程访问数据库,要考虑会话的同步与互斥,proc为每一个连接会分配一个runtime context,
而每一次访问数据库都要指定使用哪个context,否则内存错误。这时我们发现我们的proc程序要重写了,每一个proc的函数都要传递一个context变量了,这个工作量将是巨大的现在请问各位高手,我应该采用什么样的方案可使工作量减到最少? 

解决方案 »

  1.   

    context设置为全局不可以嘛?
      

  2.   

    我现在想做的Unix多进程的程序就遇到了问题。我也是想通过类似context全局
    来实现连接的多次共享。http://community.csdn.net/Expert/topic/4141/4141308.xml?temp=.1353113
      

  3.   

    可以不可以在每个线程中设置一个context,然后写一个统一接口的函数,设置一个它对应的函数指针。
    在其他proc函数中调用这个函数指针,来获得context,而这个函数则负责分配返回context。
    这样可以避免在proc函数改接口。
      

  4.   

    为什么每个函数都要传一个context ?你们所有服务的入口都是一个程序?
      

  5.   

    该结贴了把Context声明为全局的可以了。同时实现一个获取指定context的api函数:
    sql_context *get_context(int context_no);
    当需要访问数据库时就调用该函数以使用该context。对多个线程调用的公共函数则需要传递context。方法找到了,不过还是要改很多代码,结果头头把这个方案给否了,而是只是在连接数据库
    时实现互斥。不过我窃以为这是一个地雷啊。多谢ChinaOk(农村表哥),给了我不少启示。
    总结一下。
    1、不改proc函数接口是不可能的,因为预编译时指定threads=yes,则会在代码中搜索
    exec sql context use 语句。
    2、sqlca应该使用本地的,别用全局的。