oracle批量插入blob,OCI BLOB批量操作解决办法

OCI BLOB批量操作

我下面的代码是批量更新数据库里BLOB字段,测试之后发现更新1000条50KB的图片要17秒,而C#只需要13秒,理论上我使用OCI应该比C#快,但现在却要慢得多,不知道我的方法正不正确,有没有其他好的方法?

/*

* 根据ID批量更新BLOB数据

* @paramID和图片路径组成的集合

* @param表名称

* @param主键名称

* @paramBLOB字段名称

* @param失败的记录

*/

bool OracleStatementImpl::CopyBlobIn(map& fileNames, const string& tableName, const string& primaryKey, const string& blobColumnName, map& failure)

{

failure.clear();

reset();

string sql = "update "+ tableName + " set "+ blobColumnName + " = :1"

+" where " + primaryKey +" = :2";

char buffer[255];

CHECK(_sessImpl->errhp, OCIDescriptorAlloc((dvoid *) _sessImpl->envhp, (dvoid **) &lobl,

(ub4)OCI_DTYPE_LOB, (size_t) 0, (dvoid **) 0));

CHECK(_sessImpl->errhp, OCILobCreateTemporary(_sessImpl->svchp,_sessImpl->errhp,lobl,0,SQLCS_IMPLICIT,

OCI_TEMP_BLOB, OCI_ATTR_NOCACHE, OCI_DURATION_SESSION));

CHECK(_sessImpl->errhp, OCIStmtPrepare(stmthp, _sessImpl->errhp, (ub1*)sql.c_str(), strlen(sql.c_str()), OCI_NTV_SYNTAX, OCI_DEFAULT));

CHECK(_sessImpl->errhp, OCIBindByPos(stmthp, &m_pBind, _sessImpl->errhp, 1, (dvoid*)&lobl,

sizeof(OCILobLocator *), SQLT_BLOB, 0,0,0,0,0, OCI_DEFAULT));

CHECK(_sessImpl->errhp, OCIBindByPos(stmthp, &m_pBind, _sessImpl->errhp,

(ub4)2, (dvoid*)buffer, (sb4)sizeof(buffer), (ub2)SQLT_AVC,

0,0,0,0,0, OCI_DEFAULT));

_sessImpl->begin();

for(map::iterator file = fileNames.begin(); file != fileNames.end(); file++)

{

strcpy(buffer,file->first.c_str());

sb4 status = OCIStmtExecute(_sessImpl->svchp, stmthp, _sessImpl->errhp,

(ub4)1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,

OCI_DEFAULT);

if(status == OCI_NO_DATA)

{

failure.insert(*file);

continue;

}

FILE* fp = fopen(file->second.c_str(), (const char *) "rb");

if(!fp)

{

failure.insert(*file);

continue;

}

stream_write_lob(lobl, fp, get_file_length(fp));

fclose(fp);

}

_sessImpl->commit();

CHECK(_sessImpl->errhp,OCIDescriptorFree((dvoid *) lobl, (ub4) OCI_DTYPE_LOB));

return (failure.size() == 0);

}

------解决方案--------------------

汗,遇到了类似的问题,不过我的是批量获取blob字段慢~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值