免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2760 | 回复: 3
打印 上一主题 下一主题

ora10,Pro*c下子进程调用数据库问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-03 11:18 |只看该作者 |倒序浏览
求助
大约fork到760个进程的时候,数据库就拒绝连接了
程序基本上就是主程序fork一个子进程,然后子进程操作数据库后退出
-12549:ORA-12549: TNSperating system resource quota exceeded

这是我的代码

#include <sys/time.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <netinet/in.h>
EXEC SQL INCLUDE sqlca;
EXEC   SQL   INCLUDE   oraca;  
EXEC   ORACLE   OPTION   (ORACA=YES);  
EXEC   ORACLE   OPTION   (RELEASE_CURSOR=YES);  
#define SQLCODE sqlca.sqlcode
int main(void)
{
        int conFlag=10000;
        int t;
        while(conFlag>0)
               {
                       conFlag--;
                       usleep(1000*100);
                       //sleep(1);
                /*创建新的连接 */
            if(fork()==0)
             {        /*子进程代码 */
                     printf("sleep ok[%d]\n",conFlag);
                printf("process start[%d]\n",conFlag);
                startProcess();
                printf("process quit[%d]\n",conFlag);
                exit(0);
                  
              }
         
                      else
                      {
                      }
                     
       }
      
        exit(0);
}
int  startProcess()
{
        sql_context context;
        struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */
        char uid[] = "maps/maps";
        /* 以下SQL语句的执行顺序不能更改 */
        EXEC SQL ENABLE THREADS;
        EXEC SQL CONTEXT ALLOCATE :context;
        EXEC SQL CONTEXT USE :context;
        EXEC SQL CONNECT :uid;
        if(SQLCODE<0){
                printf("创建数据库连接失败,%d:%s\n", SQLCODE,sqlca.sqlerrm.sqlerrmc);
                return -1;
        }
        insert_data( context );
        EXEC SQL COMMIT WORK RELEASE;
        if(SQLCODE<0){
                printf("断开数据库连接失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc );
                return -1;
        }
        EXEC SQL CONTEXT FREE :context;
       
        return 0;
}
int insert_data( context )
{
        struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */
        int i;
        int msg_seq;
        EXEC SQL CONTEXT USE :context; /* 指定执行SQL语句的上下文 */
        for(i=0; i<2; i++ ){
                EXEC SQL select SMP_ID_SEQ.NEXTVAL into :msg_seq from DUAL;
        if(sqlca.sqlcode!=0)
        {
                printf("取序列号失败!%d\n",sqlca.sqlcode);
                return -1;
        }
               
                EXEC SQL insert into smp_msg_store values(:msg_seq,1,1,:i);
                if(SQLCODE!=0){
                        printf("插入纪录失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc);
                        return -1;
                }
        }
}

论坛徽章:
0
2 [报告]
发表于 2008-09-03 15:19 |只看该作者
my god,数据库连接数太多。

你应该使用多线程共享有限的数据库连接,用连接池,要用就取一个,用完了就释放。
不过这不是proc的强项

论坛徽章:
0
3 [报告]
发表于 2008-09-03 22:49 |只看该作者
alter system set processes = XXXXX
更大的一个数,就可以了
不过正如楼上说的,用连接池吧。
proc是可以
编译时候加上连接池选项就可以。
不过我记不清楚了。你查查proc的手册吧

论坛徽章:
0
4 [报告]
发表于 2008-09-04 11:11 |只看该作者
嘿嘿,搞定了,其实是忘了waitpid
至于connection pool,要是java还考虑考虑,这是unix下的c,还是算了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP