Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063258
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类:

2010-02-08 14:02:22

   问题描述:
   程序使用OCI方式编程,运行于solaris操作系统上,sql语句为格式相同的插入语句。发现每执行一段比较固定的时间,就会在某次OCIStmtExecute时等上约3s的时间,间隔时间基本相同,等待的时间也基本上相同。下面为主要的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);


 问题处理过程:
   1. 考虑:怀疑等待的3s是数据库正在提交
      处理:在每个语句后增加commit语句。
      结果:仍然存在上述现象;
 
   2. 考虑:可能是数据库存在性能问题
      处理:采用非阻塞模式执行语句。语句如下:   

OCIAttrSet(pOraEnv->srvhp, OCI_HTYPE_SERVER,0, (ub4)0,   OCI_ATTR_NONBLOCKING_MODE, pOraEnv->errhp)

      结果:仍然存在上述问题。
 
   2. 检查数据库v$session_wait视图

在sqlplus中执行,
select sid,p1,p2,p3,wait_time,seconds_in_wait from v$session_wait

发现,在程序执行的过程中,会有一个sid号为33的等待出现;

在程序执行过程中不断执行下面的sql语句

select * from v$session_wait where sid =33;

发现,存在描述为

   log file switch (checkpoint incomplete)

关于v$session_wait视图的使用及其他的错误可以参考下面的文章:

http://www.cnblogs.com/jimeper/articles/1129436.html

   在网上找到资料说,这个错误是由于日志文件过小,或者日志组数过少造成的。随机检查oracle的日志参数,发现日志文件果然太小了。
   处理:修改日志组大小,操作过程如下:

在sqlplus中执行,

select a.status, b.member, a.THREAD#, a.GROUP# from v$log a, v$logfile b where a.GROUP#=b.GROUP#;

查看日志组状态,并将其中状态为inactive的一个先删除,如删除日志组内第二个日志文件如下,

alter database drop logfile group2;

然后新增一个日志文件:

alter database add logfile group2 ('/export/home/oracle/oradata/redo2.log') size 120M reuse;

如上操作,将所有日志文件都改大。

注意:

1. 如果目前为current的日志组不能直接删除,要先切换日志,

  alter system switch logfile;

  然后手动同步检查点:

  alter system checkpoint;

  然后进行相关删除操作;

2. 如果当前日志组只有两个文件,则不能删除,可以考虑先增加一个日志文件再将原有文件删除。

相关日志操作可以参考下面的文章:

http://blog.csdn.net/inthirties/archive/2009/05/30/4225566.aspx

   结果:执行操作后,数据库不再出现执行一段时间后等待的情况了。
阅读(959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~