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,每条记录一次,增加了与数据库服务器之间的交互。