请教各位,我遇到了如下问题:
环境: HP-UX AI64+ORACLE RAC 10G+OCCI
问题: 在写CLOB字段时,被锁阻塞住,一直未能释放,这是堆栈信息:
    #0  0x60000000c02a6bd0:0 in __ksleep+0x30 () from /usr/lib/hpux32/libc.so.1
    #1  0x60000000c038d6c0:0 in __mxn_sleep+0xab0 () from /usr/lib/hpux32/libpthread.so.1
    #2  0x60000000c034bd10:0 in <unknown_procedure> + 0x4a0 () from /usr/lib/hpux32/libpthread.so.1
    #3  0x60000000c034ff10:0 in pthread_mutex_lock+0x170 () from /usr/lib/hpux32/libpthread.so.1
    #4  0x60000000dd512ce0:0 in sltsmna+0x60 () from /oracle/oracle/app/oracle/product/10.2.0/db_1/lib32/libclntsh.so.10.1
    #5  0x60000000dbd90fe0:0 in kpullas+0x1d40 () from /oracle/oracle/app/oracle/product/10.2.0/db_1/lib32/libclntsh.so.10.1
    #6  0x60000000dbe9ea10:0 in OCILobLocatorAssign+0x30 () from /oracle/oracle/app/oracle/product/10.2.0/db_1/lib32/libclntsh.so.10.1
    #7  0x561ded0:0 in oracle::occi::Clob::Clob(oracle::occi::Connection const*,OCILobLocator*,bool)+0x1b0 () at occiClob.cpp:204
    #8  0x55d9750:0 in oracle::occi::ResultSetImpl::getClob () at occiResultSetImpl.cpp:1892
    #9  0x4e11de0:0 in CTableObj::PutClobVal2DB (this=0x77337e50, rs=0x407fbaf8, pTblDef=0x4078b3e4, rec=@0x77337db0) at /home/xc/src/IPSServer/../../include/Cinclude/IPSServer/DBConnection.cpp:788Oracle数据库环境模式:多线程保护+支持面向对象,即Environment::THREADED_MUTEXED | Environment::OBJECT
请各位不吝指教,多谢!

解决方案 »

  1.   

    多谢支持!
    这是我的部分代码
    =========================================================
    Environment::Mode eMode;eMode = (Environment::Mode)(Environment::THREADED_MUTEXED | Environment::OBJECT);_Env = Environment::createEnvironment("SIMPLIFIED CHINESE_CHINA.UTF8","SIMPLIFIED CHINESE_CHINA.AL16UTF16", eMode);
    _Env->setCacheOptSize(41943040);
    _Env->setCacheMaxSize(10);
    .....stmt = pOraCn->createStatement(sCLOBSQL);
    if ( NULL != stmt )
    {
        ResultSet* rs = NULL;    rs = stmt->executeQuery();
        if ( NULL != rs )
        {
            if ( oracle::occi::ResultSet::END_OF_FETCH != rs->next() )
            {
                Clob vClob;            vClob = rs->getClob(1);
                vClob.open();
                try
                {
                    vClob.write(sVal.length(), (unsigned char*)sVal.c_str(), sVal.length(), 1);
                }
                catch ( ... ) 
                {
                //
                }
                vClob.close();
            }
            stmt->executeUpdate();
            stmt->closeResultSet(rs);
        }
        pOraCn->commit();
        pOraCn->terminateStatement(stmt);
    }
    ========================================================= 
    希望各位同学多多指点!
      

  2.   

    现在的替代办法是:每线程一个Oracle连接,而非前面的那种多个线程共用一个Oracle连接