在做一个历史数据系统,每秒采样一次,将数据记录进oracle数据库。机器环境为solaris10,数据库环境为10g,编程语言为c使用OCI连接数据库。由于数据量比较大,每秒约插入2000条记录,所以用绑定变量组织sql语句。
    问题是,发现程序每运行大约20s,就会在某次OCIStmtExecute时等上约3s的时间。小弟接触OCI时间不长,实在找不到问题所在,各位大虾帮帮忙啦,指点下,感谢啊

解决方案 »

  1.   

    噢,这个3s可能是在达到了提交计数点,数据库在commit呢。
    你可以在程序中做下批量提交,比如每1000条~10000条用程序显式commit一下。java的preparedstatement有executeBatch的提交,不知道oci是否也支持这样的?
      

  2.   

    再说具体点吧, 
    下面是我的OCI相关代码连接数据库语句: 
    OCIServerAttach(pOraEnv->srvhp, pOraEnv->errhp,(text *)pDbCon->dbname, strlen(pDbCon->dbname),OCI_DEFAULT) 
    OCILogon(pOraEnv->envhp,pOraEnv->errhp,&pOraEnv->svchp,(text *)pDbCon->username,strlen(pDbCon->username),(text *)pDbCon->passwd,strlen(pDbCon->passwd),(text *)pDbCon->dbname,strlen(pDbCon->dbname)); 执行sql用的语句: 
    OCIStmtExecute(pOraEnv->svchp, pOraEnv->stmthp, pOraEnv->errhp, 1, 0, NULL, NULL, OCI_DEFAULT|OCI_COMMIT_ON_SUCCESS); 也试过用下面的语句去修改非阻塞模式,好像也没什么用。 
    OCIAttrSet(pOraEnv->srvhp, OCI_HTYPE_SERVER,0, (ub4)0, OCI_ATTR_NONBLOCKING_MODE, pOraEnv->errhp) 因为我在OCIStmtExecute的时候带上了OCI_COMMIT_ON_SUCCESS,按理说,应该是已经commit过了。
      

  3.   

    刚试了下,如果减少每秒的数据量,则发生OCIStmtExecute上等待的间隔时间就会变长,但是每次在OCIStmtExecute上等待的时间仍然不变,还是3s。 
      

  4.   

    sql代码很简单的: 
    insert into xxx values(:1, :2 , :3, :4, :5, :6 , :7, :8, :9, :10); 手动检查程序出现等待时候的cpu率,基本上idle都是90以上,oracle的cpu占用率保持在1.5以下。不像是有资源争用 
      

  5.   

    看你的代码似乎是insert 一条,commit一次。数据量大的话,最好采用数组方式批量提交。
    http://club.cyworld.com.cn/board/view.php?clubid=202000036487&postid=158679
      

  6.   

    自己顶一下,最后发现不是oci的问题,是oracle配置中日志文件过小,所以在切换日志文件时,前一个日志文件还没有归档,的checkpoint还没有完成。
    查看了v$session_wait视图才发现问题。
    最后resize数据库log文件解决。
    详见http://blog.chinaunix.net/u2/87101/showart.php?id=2180022