首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

内存不释放?解决方法

2013-01-25 
内存不释放???本帖最后由 afeideweixiao 于 2012-04-24 11:49:50 编辑各位好!请教个问题,我不断地往oracle

内存不释放???
本帖最后由 afeideweixiao 于 2012-04-24 11:49:50 编辑 各位好!请教个问题,我不断地往oracle里插入数据,oracle会出现内存不断飙升,o只到电脑内存不足而挂掉。
系统为WINDOWS 2003,
刚开启时,ORACLE.EXE使用内存为200M左右,任务管理器下的显示内存使用为1020M/3428M;
运行几个小时后,ORACLE.EXE使用内存变为600M,而任务管理器下显示内存使用高达2987M/3428M。
请问是什么原因呢?谢谢了。。。

插入测试代码如下:
 


  int main() 
  {
     Environment * env = Environment::createEnvironment( " ZHS16GBK " , " UTF8 " );
     char *szInsert = "某插入语句";   

     string mc;
      {
         Connection * conn = env->createConnection( " system " , " system " , " orcl_192.168.0.3 " );
         
         try 
         {
    while (1)
            {
             Statement * stmt = conn->createStatement(szInsert );
             stmt->executeUpdate();
             conn->terminateStatement(stmt);
                conn->commit();
                Sleep(10); //10毫秒
    }
         } 
         catch (SQLException e)
         {
             cout << e.what();
         } 
         env -> terminateConnection(conn);
     } 
     Environment::terminateEnvironment(env);
     system( " pause " );
     return 0 ;
}


 
最初我以为是createStatement操作造成内存没释放,后来我改为只创建一次,但是还是出现内存不断飙升不释放的问题。
         
       try 
         {
    Statement * stmt = conn->createStatement(szInsert );
    while (1)
            {
             stmt->executeUpdate();
                conn->commit();
                Sleep(10); //10毫秒
    }
            conn->terminateStatement(stmt);
         } 
         catch (SQLException e)
         {


             cout << e.what();
         } 




请问是什么原因呢?谢谢。。。。

[解决办法]

while (1)
            {
                 Statement * stmt = conn->createStatement(szInsert );
                 stmt->executeUpdate();
                 conn->terminateStatement(stmt);
                conn->commit();
                Sleep(10); //10毫秒
        }

感觉没有退出循环的语句啊,将上述代码改成只执行一次,即去掉循环,看看还飙升不?
如果不是,那就应该是循环的问题。
[解决办法]
这个问题跟OS刷新逻辑页到磁盘物理页的时间长短以及你大量更新数据,导致oracle产生大量的逻辑脏页有关。跟应用程序关系还不大。如果你sleep长一些时间,比如10秒,就应该不会看到内存暴涨。因为当逻辑页刷入到磁盘后,相关的内存会被释放掉。

如果LZ是处理大量数据的插入的问题,则建议采用数组插入的方式。OCI下没有玩过,PROC*C下是有的。在数组插入的方式下,Oracle采用块拷贝的方式,日志会少很多,因此逻辑脏页也会少很多。还有一种解决方案是,将数据转换成sqlldr可以识别的格式,然后用sqlldr将数据装入。这些方法都会比单条记录插入的方式要快很多。

热点排行