1

我正在使用 ADODB C++ 执行查询,例如从表中选择 *。这张表有大约 4GB 的大数据。因此,当我执行查询时,它会获取所有记录并增加堆内存并将所有记录加载到客户端计算机虚拟内存上。这是我的代码

// **Create Record set Object**  
ADODB::_RecordsetPtr m_pRecordSetData= NULL;
HRESULT hr = m_pRecordSetData.CreateInstance(__uuidof(ADODB::Recordset));
m_pRecordSetData->CursorType = ADODB::adOpenStatic;
m_pRecordSetData->CursorLocation = ADODB::adUseClient;  
m_pRecordSetData->LockType = ADODB::adLockReadOnly;

**// Create Command Object**
ADODB::_CommandPtr pCmdPtr = NULL;
HRESULT hr = pCmdPtr.CreateInstance(__uuidof(ADODB::Command));
if (FAILED(hr))
{
    return pCmdPtr;
}   
pCmdPtr->PutCommandType(ADODB::adCmdText);
pCmdPtr->PutCommandTimeout(0);
pCmdPtr->ActiveConnection = m_pConnection;
pCmdPtr->CommandText = L"Select * from Table";

**// Execute Query Select * from table**
_variant_t vtConn;
 vtConn.vt = VT_ERROR;
 vtConn.scode = DISP_E_PARAMNOTFOUND;
 HRESULT hr = m_pRecordSetData->Open((_variant_t((IDispatch *)pCmdPtr)), vtConn, 
                                      ADODB::adOpenStatic, ADODB::adLockReadOnly, -1);

 

因此,当我们执行最后一行 Recordset Open 时,这将阻塞,直到获取所有记录。所以它消耗了系统的所有堆内存。

期望/要求:我们可以批量获取记录/仅几行吗?, 所以我们可以分配那个堆内存并释放它。所以这不会消耗所有客户端堆内存。我们可以异步获取我们将批量获取下一条记录吗?所以我们不想一次性获取所有记录。

4

0 回答 0