释放数组DML操作的内存

4

我正在使用数组DML操作,以加快将大量记录插入到SQL数据库中的速度。该原则在这里进行了描述。以下是如何使用此功能的示例代码:

TFDQuery *FDQuery1;
...
FDQuery1->SQL->Text = "insert into MyTab values (:p1, :p2, :p3)";
// here FDQuery1->Params collection is filled by 3 parameters
const int array_size = 100;
FDQuery1->Params->ArraySize = array_size;
FDQuery->Prepared = true;
for(int i = 0; i < array_size; i++)
{
  FDQuery1->Params[0]->AsIntegers[i] = i;
  FDQuery1->Params[1]->AsStrings[i] = "qwe";
  FDQuery1->Params[2]->Clear(i);
}
FDQuery1->Execute(array_size);

基本上,这意味着我不是为每一行插入数据调用数据库引擎客户端函数,而是首先将需要插入的数据准备成数组。数组的典型大小为1000个项目。然后,我使用数组作为参数调用客户端函数。不幸的是,在文档中没有描述参数数组的内存何时被释放。当我取消准备查询时是否会释放?
TFDQuery *query;
...
query->Prepared = false;

还是在我关闭查询时完成?

query->Close();

当我将数组大小设置为1时,是否已经完成了操作?
query->Params->ArraySize = 1

你能展示一下你是如何编写数组参数的代码吗? - Uwe Raabe
这并不直接与您的问题相关,但您使用哪种类型的Sql Server? - MartynA
我正在使用 Firebird 2.5.4。 - truthseeker
当将ArraySize设置为1时,param数组的内存会被释放,但我不确定这是否与此相关。您是否遇到任何问题或只是好奇? - Uwe Raabe
2
只是不想在不再使用时保留已分配的内存。根据文档(请参见上面的链接),Oracle数据库将为每个字符串分配4000字节。因此,对于1000条记录,它占用4MB,我们仅谈论一个列。我的一些表有数十个列。而且我的程序使用多个查询。释放不再需要的内存是良好编程风格的问题。 - truthseeker
在这种情况下,将ArraySize设置为1应该就足够了。 - Uwe Raabe
1个回答

1

在设计中,我的观点是参数集合应该在取消准备或关闭查询时保持不变,因为它是手动填充的集合(当命令被分配和启用ParamCreate时,预处理器会自动填充;在命令准备时进行更正)。但是,您可能希望稍后执行相同的命令而不设置相同的集合。

如果您知道不会再次执行相同的命令,则可以调用Clear方法:

query->Params->Clear();

如果您想保留参数设置,并仅释放由值存储消耗的资源,您可以通过ArraySize属性减少参数行数
query->Params->ArraySize = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接