如果你在某些方面是个小白,那你走每一步都很受挫。
最近公司做了一个XXX系统(C++),使用ADO连接数据库,系统实现之后发现,数据库的插入效率很是问题,10万条左右的记录用时9分多钟,当然不管是客户端还是服务器的配置都比较低,但应该也不至于速度如此之慢,网上搜了下,有些人的插入效率能达到每秒8000条,看着这些数据我也是醉了,于是,就想优化一下数据库的插入效率。
当然,我写这个的目的并不是说我的数据库是怎么优化的(最后还是没成功,优化为了10万条用时3分钟,每秒500条,比着8000条还是没法说的)。我的目的是想说一下ADO的记录集(RecordsetPrt)的AddNew()从不能用到能用的艰辛过程,如果你也遇到这种问题了,或许对你有帮助。
首先先交代一下背景,一开始插入数据库的操作是使用的ADO中的连接对象(ConnectPtr),然后通过将要插入的数据拼成SQL执行的方式来进行数据插入。由于插入效率太低,我准备改成使用记录集(RecordsetPtr)来进行插入处理。
上网搜了下,使用RecordsetPtr来插入时很简单,只要Open之后,AddNew,然后PutCollect,最后Update或者UpdateBatch就行了。于是照着葫芦画了个瓢,结果怎么都不行,一直在Support(adAddNew)的时候返回False,将Support注释之后,AddNew一直抛异常。
对于这个现象,我首先考虑的是,记录集的属性设置可能不对,于是又看了下网上的例子,对于打开时指定的参数(比如CursorType),我跟那些例子是一样的(①打开方式不能是Static的 ②不能是通过ConnectPtr或者CommandPtr调用Execute的到的记录集),从官网上看,需要AddNew时打开方式应该是adOpenKeyset,我实际测试时使用adOpenKeyset打开时返回的也是OK,而使用adOpenDynamic打开时虽然返回的不是不成功,但是返回了个