Существует два метода- подключение к базе и отключение от нее, проблема в том что не происходит освобождение памяти при при вызове DBDisconnect(). Данные методы вызываются при подключении клиента к серверу, последний соединяется с бд и грузит оттуда необходимые данные. Если производить соединение/отключение при каждой необходимости чтения, размер приложения постоянно растет, кроме этого участка кода динамическое выделение больше нигде не используется, также проверено что при отключении чтения из бд размер приложения остается постоянным.
В данный момент соединение происходит однажды при создании объекта CNetSection, отключение соответственно при удалении последнего. При данной реализации проблема с утечкой памяти решается (возможно не до конца при создании/удалении память наверное теряется, но так как объект создается один раз это не оказывает большого влияния), что также наводит на мысль о потере памяти в DBDisconnect().
Все функции в DBDisconnect() выполняются нормально (возвращают SQL_SUCCESS).
Вопрос 1: в чем тут может быть проблема?
Вопрос 2: корректно ли постоянно держать открытое соединение с базой?
void CNetSection::DBConnect()
{
SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLConnect(hdbc, (SQLTCHAR*)"mytest", 6, (SQLTCHAR*)"root", 4, (SQLTCHAR*)"asd", 3);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
}
void CNetSection::DBDisconnect()
{
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
Здравствуйте, veselchaku, Вы писали:
V>Здравствуйте, Аноним, Вы писали:
А>>Существует два метода- подключение к базе и отключение от нее, проблема в том что не происходит освобождение памяти при при вызове DBDisconnect(). ...
V>У меня такая же проблема. Есть сервис, который периодически записывает информацию в БД. За день происходит порядка 170 коннектов и дисконнектов. Так вот к концу дня процессом сжирается порядка 20 Мб памяти. Посмотрел дебагером — причина в том, что память не освобождается при вызове SQLFreeHandle.
V>Если вы решили проблему, напишите ее решение здесь.
Хотя наверное соврал я, просто не вызвал SQLFreeHandle(SQL_HANDLE_DBC, m_hdbc);