otl_stream 和 otl_connect 的 auto_commit 解惑

OTL 是一套用于访问多种数据库的类库,支持按ODBC和数据库自身提供的API(Oracle,TimesTen,DB2 和 Informix)来访问数据库。

在其提供的otl_connect和otl_stream里面,都有一个auto commit属性,文档里面说它俩完全没有关系,但看描述又觉得其功能似乎是一样的,那为什么要搞两个属性呢?下面我以我的理解来解释一下:

otl_stream——如果开启auto commit,是指在在其缓存(构造otl_stream时指定了一个缓存大小)满之后,会把缓存里面的数据组成一条一条的sql语句提交到数据库服务器执行(这个与auto commit无关),最后跟一条 otl_connect::commit()调用(构造otl_stream时,我们传入了otl_connect,所以otl_stream是可以调用 otl_connect::commit的)。

otl_connect——如果开启auto commit,它其实是一个数据库session的属性,这个属性会发到数据库服务器,这样在每执行一次sql语句之后,隐含地调用一次commit (OTL不会显示调用,数据库服务器自动执行)。

 

下面举几个例子:

假如otl_stream缓存设置为100且开启auto commit,otl_connect不开启auto commit,那么相当于每执行100条sql语句(比如insert,一条记录一条sql语句)之后,显示(由otl_stream执行)调一次commit,这是效率最高的:

insert 1

...

insert 100

commit

 

假如otl_stream缓存设置为100且开启auto commit,otl_connect也开启auto commit,那相当于(otl_stream的auto commit变得无意义):

insert 1

commit (隐式)

...

insert 100

commit (隐式)

commit

 

假如otl_stream缓存设置为100且不开启auto commit,otl_connect开启auto commit,那相当于:

insert 1

commit (隐式)

...

insert 100

commit (隐式)

 

假如otl_stream缓存设置为100且不开启auto commit,otl_connect也不开启auto commit,那相当于(开发者需要自己调用otl_connect::commit):

insert 1

...

insert n

 

于是我们想到一个优化,假如我们想一条sql语句一次commit,可以开启otl_stream的auto commit,然后将其缓存大小设置为1,也可以保持otl_stream的缓存大小(或者也可以为1,这个变得无所谓了),关闭其auto commit,但开启otl_connect的auto commit。很显然,后一种方法更好,前一种方法会显示的调用commit,每条记录一次,增加了与数据库服务器之间的交互。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值