Привет.
Пишу сервис на базе ATL, который работает с базой данных через ADO. Каждые Т секунд подается запрос базе данных.
Неделю назад началась борьба с Memory Leaks...
Поставил NuMega BoundsChecker и отловил "мои" баги.
Всяческие проверки стандартными средствами (типа crtdbg, _heapchk()) также показывают, что все в порядке — ML нет.
Но, при работе сервиса, working set процесса начинает расти... также ратстет и Page Faults.
Локализация участков кода, позволила найти "проблемный" участок: это любое обращение к ADO из проекта.
Другими словами, при обращении к базе с простым запросом на выборку гарантировано получаем увеличение размера Page Faults
и working set. Даже, если recordset возвращается пустой.
Причем, рост Page Faults и working set процесса непрекращающийся процесс.
Комментарю ниже приведенны блок работы с ADO — все в порядке — working set остается стабильным.
В документации к ADO сказано, что специально удалять рекордсет не надо, достаточно просто закрыть его... Не вижу где еще в коде могут быть проблемы...
Подскажите, в чем здесь грабли?
try{
if (SUCCEEDED(recordset->Open(
(LPCTSTR)query,
globalADOSupport.getConnection().GetInterfacePtr(),
adOpenStatic, adLockOptimistic, adCmdText))
){
if (recordset->GetRecordCount()>0){
sprintf(buffer, "Located %d old jobs.", recordset->GetRecordCount());
while (recordset->EndOfFile==VARIANT_FALSE){
OID=(_bstr_t)recordset->GetFields()->GetItem(short(0))->Value;
ATLTRACE("OID=%d\n", OID);
recordset->MoveNext();
query="DELETE FROM U_Job WHERE job_OID="+OID;
gpADOSupport.getConnection()->Execute((LPCTSTR)query, &affectedRows, adExecuteNoRecords);
if ((long)affectedRows!=0){
sprintf(buffer, "Job OID=%s was deleted successfull.", (LPCTSTR)OID);
}else{
sprintf(buffer, "Unable to delete job OID=%s.", (LPCTSTR)OID);
}
}
}
recordset->Close();
recordset=NULL;
}
}catch (_com_error exception){
....................
ExitProcess(0xFFFF);
}
Спасибо!
Здравствуйте, shelkovnikov, Вы писали:
Спешу напомнить, что оверквотинг категорически не приветствуется. Последующие меры будут жестче, это относится ко всем оверквотерам.
... << RSDN@Home 1.2.0 alpha rev. 0>>