OTL的流缓冲池

一般来讲,流一般作为一个局部的变量被使用,当使用完毕后就立刻关闭,如果需要再次使用就需要再次的声明变量,如此循环。OTL流的缓冲池(内存池)是一个解决以往的流性能低下的一个机制。当流被关闭后,实际上流的相关变量被保存在一个流缓冲池里面,以便再利用。

每一个流在解析SQL或与数据库层打交道的时候都存在着巨大的资源开销。OTL通过流缓冲池机制来解决这个不必要的开销以提高性能。

当一个流“关闭”后,实际上,它被保存在一个流缓冲池里面。如果后面再需要一个类似的流,那么就只需要把流缓冲池里面的流取出来赋给相应的流变量即可再使用。不管该变量是局部还是全局的变量。相似的地方在于流的缓冲区大小与流相关的SQL语句是相同的。它们被保存在流缓冲池里面。

比如说有三个已经被关闭了的相似(缓冲区大小与SQL语句类型相同)的流已经被分配了内存资源。但实际上,在流的缓冲池里面只有一个入口,也就是说只有这三个流的一个副本。如果后面再需要相似的流,那么就会从中把取出该副本赋给对应的变量使用。如果有一个循环里面要不停的使用这个相同的流的话,那实际上流的主体总是这个相同的流。它被从流缓冲池里面取出来后赋给相应的变量再续使用。

在某些时候,某个流可能就真的只使用一次就关闭,这个时候otl_stream::close()有一个对应的扩展函数提供给开发者强制关闭流而不放在流缓冲池里面。

如果在某些情况下的确不想使用流缓冲池技术,我们还可以通过宏来关闭流缓冲池。这个需要在编译的时候确定下来。

通过上面的介绍,很明显,流缓冲池是一个otl_connect对象,同样,它还有一个最大容量限制,我们可以通过otl_connect::set_stream_pool_size()函数进行设置。

因为流缓冲池使用了map和vector,所以在使用流缓冲池的时候,必须要定义OTL_STL(或OTL_ACE)宏。

当一个新的流被要求加入到流缓冲池中,但是流缓冲池已满了,这个时候,用的最少的那个流将被从流缓冲池中清除,而把最新的这个流放进来。

从Sergei Kuchin统计的信息来看,流缓冲池还是相对有一个些开销的,这个主要原因是因为STL里面的MAP容器的开销导致。

下面为流缓冲池的一个简单图例:

OTL翻译(10) -- OTL的流缓冲池的更多相关文章

  1. OTL翻译(2) -- OTL流的概念

    OTL流的概念 任何的SQL语句.SQL语句块或存储过程,都是通过输入与输出变量进行处理参数与结果的. 如: 例1:一个SELECT语句把标量的输入变量作为WHERE子句部分的条件:同时SELECT部 ...

  2. otl翻译(11) -- OTL的迭代器

    OTL stream read iterator 这个类是一个像传统的JDBC中的getter()操作一样扩展了OTL流的模板类.它现在还不支持UNICODE字符集.它对otl_refcur_stre ...

  3. OTL翻译(3) -- OTL的主要类

    相比于传统的C++类库而言,OTL更像是一个代码容器,里面复杂,但对外的接口简单.OTL在处理程序方面受到了STL的影响. OTL有一个模板框架,它实现了otl_stream的概念.该框架由模板类和内 ...

  4. OTL翻译(5) -- otl_stream流相关绑定变量

    声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...

  5. OTL翻译(4) -- otl_stream类

    otl_stream Otl_stream是具体实现otl_stream_concept的类.任何的SQL语句.SQL语句块和存储过程都能通过otl_stream进行处理. 传统的数据库API处理SQ ...

  6. 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  7. OTL翻译(6) -- otl_connect类

    otl_connect 这个类封装了连接的功能,如连接.断开连接.提交.回滚等.otl_connect也就是一个用来创建连接对象并进行管理的类. 序号 方法.变量 说明 1 int connected ...

  8. OTL翻译(8) -- otl_long_string/otl_long_unicode_string类

    otl_long_string/olt_long_unicode_string 这两个类主要用来处理大对象数据.从OTL4.0版本开始,otl_long_string还可以处理任何类型的RAW/BIA ...

  9. OTL翻译(1) -- 说明

    说明 该文档说明的是4.0版本的ORACLE/ODBC和DB2-CLI模板库(OTL).OTL4.0(后面简称OTL)模板库是基于C++的模板的. OTL4.0是组合了C++的模板框架和OTL适配器. ...

随机推荐

  1. 32:从1到n整数中1出现的次数

    import java.util.Arrays; /** * 面试题32:从1到n整数中1出现的次数 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? * 为此他特别数了 ...

  2. caffe for python

    导言 本教程中,我们将会利用Caffe官方提供的深度模型——CaffeNet(该模型是基于Krizhevsky等人的模型的)来演示图像识别与分类.我们将分别用CPU和GPU来进行演示,并对比其性能.然 ...

  3. linux config

    1.自定义命令:.bashrc 文件添加自定义命令 2.完成后,命令:source . .bashrc  使配置的自定义命令生效,如果提示没有该命令的情况,用   . .bashrc (注意是2个“点 ...

  4. Category 特性在 iOS 组件化中的应用与管控

    背景 iOS Category功能简介 Category 是 Objective-C 2.0之后添加的语言特性. Category 就是对装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下, ...

  5. 一个人也可以建立 TCP 连接呢

    今天(恰巧是今天)看到有人在 SegmentFault 上问「TCP server 为什么一个端口可以建立多个连接?」.提问者认为 client 端就不能使用相同的本地端口了.理论上来说,确定一条链路 ...

  6. 如何破解安卓App

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha  313134555@qq.com 如何破解安卓App

  7. 顺序线性表之大整数求和C++实现

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  8. luoguP5024 保卫王国 动态dp

    题目大意: emmmmm 题解: QAQ #include <cstdio> #include <cstring> #include <iostream> usin ...

  9. 【Python3】【贪心】hdu4296 Buildings

    题意: n个板,每个板有重量和强度w和s,还有PDV值(上面的总重量-该板的强度) 对于某种叠放方式,PDV的最大值为其代表值 求该值的最小值   考虑只有两个板的情况:a和b,很显然下面的比上面的容 ...

  10. Windows下修改Git bash的HOME路径

    Windows中使用http://git-scm.com/安装Git bash工具,默认的HOME和~路径一般都是C:\Users\用户名,每次得用命令切换到常用的Repository下,此操作重复而 ...