OCCI的迭代修改
传统的在执行多行DML(INSERT、UPDATE、DELETE)时,我们是多次调用executeUpdate();注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低。不过 OCCI 提供了一种在单个网络往返中发送多行数据的高效机制。此为迭代修改。
使用addIteration()方法实现迭代
- 调用
setMaxIterations(int maxIterations)方法设置最大迭代次数 - 如果参数内存为可变的,如: string、Bytes,则调用
setMaxParamSize(int paramenterIndex, int maxParamSize)方法设置参数占用内存的大小以便OCCI内部能分配充足的内存 - 调用
setXXX()方法为绑定变量设置参数 - 在要迭代时调用
addIteration()方法 - 最后调用
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.
OCCI的迭代修改的更多相关文章
- C++通过迭代修改字符串本身(auto类型说明符)
以字符串这种支持 for (declaration : expression) statement 这样for语句迭代的数据结构为例,我们看看auto关键字在类型推断中的作用. string s = ...
- ArrayList迭代修改抛出ConcurrentModificationException
extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...
- Java并发编程:同步容器
Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...
- ReactNative新手学习之路03真机调试
React Native新手入门03真机调试(iOS) 从设备访问开发服务器 在启用开发服务器的情况下,你可以快速的迭代修改应用,然后在设备上查看结果.这样做的前提是你的电脑和设备必须在同一个wifi ...
- ReactNative真机运行指南
ReactNative真机运行指南 注意在iOS设备上运行React Native应用需要一个Apple Developer account并且把你的设备注册为测试设备.本向导只包含React Nat ...
- ReactNative真机运行运行
注意在iOS设备上运行React Native应用需要一个Apple Developer account并且把你的设备注册为测试设备.本向导只包含React Native相关的主题. 译注:从XCod ...
- 转:java多线程--同步容器
java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...
- hadoop 2.2.0的datanode中存储block的多个文件夹的负载均衡问题
hadoop的分布式文件系统HDFS的存储方式是,将数据分成block,分布式存储在整个hadoop集群的datanode中,每个block默认的大小是64M,这些block文件的具体存储位置是在ha ...
- play framework2.5.
play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...
随机推荐
- 修改linux文件权限命令
修改linux文件权限命令:chmod Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文 ...
- Java学生管理系统(连接数据库查询)超详细
这几天逼着交Java,借鉴各位师傅的做出来这么个简陋的东西,各位大师傅不要笑我.(学都没有学过Java的我,QAQ~) 下面针对的都是SQL Server系列的连接,如果你使用MySQL那么不必看关于 ...
- Linux禁ping
A.临时允许PING操作的命令为:# >/proc/sys/net/ipv4/icmp_echo_ignore_all B.永久允许PING配置方法. /etc/sysctl.conf 中增加一 ...
- Makefile2
规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, ...
- 利用DOS命令做伪装成图片的压缩包,看上去是图片其实是个压缩包用2条命令即搞定
在很多地方我们看到一张图片,然后把这张图片下载到本地,改后缀名为xx.rar,即变成了压缩包. 比如下面这个图片:(把以下图片保存到本地,后缀名xx.png 改为 xx.rar,解压试试) 怎么样,是 ...
- iOS开发实践之多线程(单例模式)
单例模式的作用:可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源. 单例模式的使用场合:在这个应用程序中,共享一份资源(这份资源只需要创建 ...
- linux创建用户与删除用户及问题解决(ubuntu)
创建的用户不正确,一直在删除创建,发现了挺多问题也学到了一些东西如下是我的总结. (root用户设置: 由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在终端 ...
- 从零开始的全栈工程师——js篇(cookie)
Cookie是由服务器端生成,发送给User-Agent,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器,对cookie知识感兴 ...
- [转c#]记录程序耗时的方法
多时候需要输出程序耗时,然后记录下来, 总是在程序执行开始记录当前时间点,在结尾记录结束时间点,然后两个时间相减, 那么有没有其他稍微像样点的方法呢? 告诉你,有滴 ; ) 这个方法主体就是 ...
- JQuery中Checkbox选择
判断是否选中 $(this).is(":checked") 取消选中 $(this).prop("checked", false) 选中 $(this).pro ...