ADO & Page Faults
От: once77  
Дата: 18.10.06 14:40
Оценка:
Привет.

Пишу сервис на базе 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);
}


Спасибо!
Re: ADO & Page Faults
От: shelkovnikov Россия  
Дата: 19.10.06 03:33
Оценка:
Здравствуйте, once77, Вы писали:


O>Подскажите, в чем здесь грабли?




1. здесь не видно, какими указателями на объект recordset вы пользуетесь
2. со строковой переменной query не может быть проблем?
попробуйте разделить работу со строками и recordset, чтобы локлизовать проблему точнее (напрмер, текст запроса выполнять используя константые сторки)
От модератора
От: IB Австрия http://rsdn.ru
Дата: 19.10.06 07:41
Оценка:
Здравствуйте, shelkovnikov, Вы писали:

Спешу напомнить, что оверквотинг категорически не приветствуется. Последующие меры будут жестче, это относится ко всем оверквотерам.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[2]: ADO & Page Faults
От: once77  
Дата: 19.10.06 09:03
Оценка:
Здравсзую твуйте, shelkovnikov, Вы писали:

S>1. здесь не видно, какими указателями на объект recordset вы пользуетесь


_RecordsetPtr recordset(__uuidof(Recordset));
_bstr_t query;

S>2. со строковой переменной query не может быть проблем?


использую _bstr_t
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.