OCCI的迭代修改

传统的在执行多行DML(INSERT、UPDATE、DELETE)时,我们是多次调用executeUpdate();注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低。不过 OCCI 提供了一种在单个网络往返中发送多行数据的高效机制。此为迭代修改。

使用addIteration()方法实现迭代

  1. 调用setMaxIterations(int maxIterations)方法设置最大迭代次数
  2. 如果参数内存为可变的,如: string、Bytes,则调用setMaxParamSize(int paramenterIndex, int maxParamSize)方法设置参数占用内存的大小以便OCCI内部能分配充足的内存
  3. 调用setXXX()方法为绑定变量设置参数
  4. 在要迭代时调用addIteration()方法
  5. 最后调用executeUpdate()方法执行DML
Environment *env = Environment::createEnvironment();
Connection *conn = env->createConnection();
Statement *stmt = conn->createStatement(sql);

stmt->setMaxIterations(2);
stmt->setMaxParamSize(2, 7);

stmt->setSQL("INSERT INTO basket_tab VALUES(:1, :2)");
stmt->setString(1, "Apples");   
stmt->setInt(2, 6);  
          
stmt->addIteration(); //增加迭代 

stmt->setString(1, "Oranges"); 
stmt->setInt(1, 4);             

stmt->executeUpdate();  //执行

使用setDataBuffer()executeArrayUpdate()方法实现迭代

在讲解此方法之前我们先要明白:当我们在参数化语句中通过setXXX()方法为绑定参数提供数据时,这些值将被复制到内部数据缓冲区中,然后将内部数据缓冲区中数据提供给数据库服务器进行DML处理。为了减少复制用户缓冲区中可用的字符串类型数据的开销,我们可以使用此方法实现性能提升。

void setDataBuffer(int paramIndex, 
void *buffer,
Type type,
sb4 size,
ub2 *length, //每个数据长度,不是指缓冲区大小,通常用数组指定每个数据长度
sb2 *ind = NULL, 
ub2 *rc = NULL); 

`paramIndex`: 参数下标
`buffer`: 包含数据的缓冲区地址, 数据缓冲区可能为一维数组或二维数组
`type`: 数据类型,OCCI提供了一个枚举
`size`: 数据大小,不是指缓冲区大小
`length`: 每个数据长度,不是指缓冲区大小,通常用数组指定每个数据长度
`ind`: 指示器信息。表示数据是否为空。对于参数化语句,值为-1表示要插入空值。对于从可调用语句返回的数据,值为-1表示检索空数据。
`rc`: 返回码。此变量对于`Statement`方法没用,但是,对于从可调用语句返回的数据,返回码指定特定于参数的错误号。
Status executeArrayUpdate(unsigned int arrayLength);
`arrayLength`: 迭代次数

Example:

Statement *stmt = conn->createStatement( 
"insert into departments (department_id, department_name) values(:1, :2)");
 
char dnames[][100] = {"Community Outreach", "University Recruiting"}; 
ub2 dnameLen[2]; 


for (int i = 0; i < 2; i++) 
dnameLen[i] = strlen(dnames[i] + 1); 


int ids[2] = {7369, 7654}; 
ub2 idLen[2] = {sizeof(ids[0]), sizeof(ids[1])}; 

stmt->setDataBuffer(1, ids, OCCIINT, sizeof(ids[0]), idLen); 
stmt->setDataBuffer(2, dnames, OCCI_SQLT_STR, sizeof(dnames[0]), dnameLen); 

stmt->executeArrayUpdate(2); // data for two rows is inserted. 

原文链接: https://www.cnblogs.com/Focus-Flying/p/9272288.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    OCCI的迭代修改

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/277179

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午2:21
下一篇 2023年2月15日 上午2:21

相关推荐