Страница: 1 |
В коде происходят некие действия каждые 5 секунд по таймеру, а именно БД открывается что-то происходит и потом закрывается. Так вот проверил, "что-то" память не ест. А вот открытие и закрытие съедает 1 мег за 5 минут. Код такой: Public Sub OpenDB() '********************************************* Где может быть утечка?
Способ связи с БД FB 1.5 (на всякий случай) ODBC (ADO 2.7). ОФФ: Новый форум просто супер, но мааааленький вопросик - а поиск по форуму когда будет? Помогите!!!! Кто-нибудь!!! У всех такая засада или нет? Страница: 1 |
Вопрос: Стремительно утекает память.
Добавлено: 25.05.04 13:51
Автор вопроса: sYstEmiZer | ICQ: 280647023
Set RecSet = New ADODB.Recordset
Set OraDB = New ADODB.Connection
Set OraCMD = New ADODB.Command
RecSet.CursorLocation = adUseClient
If OraDB.State <> 1 Then
OraDB.Open "otchet", LO, PW
OraCMD.ActiveConnection = OraDB
End If
If RecSet.State <> 1 Then
RecSet.ActiveConnection = OraDB
End If
End Sub
Public Sub CloseDB()
If OraDB.State = 1 Then
OraCMD.ActiveConnection = Nothing
OraDB.Close
End If
If RecSet.State = 1 Then
RecSet.ActiveConnection = Nothing
RecSet.Close
End If
Set RecSet = Nothing
Set OraDB = Nothing
Set OraCMD = Nothing
End Sub
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
sYstEmiZer
ICQ: 280647023
Вопросов: 16
Ответов: 45
Профиль | | #1
Добавлено: 25.05.04 13:57
Номер ответа: 2
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #2
Добавлено: 25.05.04 15:20
Это конечно не ответ на твой вопрос но код логичке правильный создал объект... а потом когда присваеваешь ... указателю на объект ... НУЛ... то система сбора мусора сама должэна очистить память ... опиши подробнее как и когда ты открываешь и закрываешь .. может быть ты два раза... открываешь базау случайно и тд итп...
Номер ответа: 3
Автор ответа:
sYstEmiZer
ICQ: 280647023
Вопросов: 16
Ответов: 45
Профиль | | #3
Добавлено: 25.05.04 16:06
А можно как-нибудь отследить какая конкретно переменная сколько памяти юзает?
Номер ответа: 4
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #4
Добавлено: 25.05.04 16:20
ПРичём тут переменные?.. ты работаешь с объектами .. и я думаю именно из за них идёт утечка памяти может быть у етбя где нибудь вызывается повторно OpenDB() до того как вызывалась CloseDB()
попробуй сделать следующие... поставь глобальную переменную типа
Dim (если всё в одном модуле или Public если в одтельном)
DIM testOpen as byte
и делай следующие при выполнении OpenDB() присвой ей значение ... 1 вот таким образом...
If (testOpen=0) then
testOpen=1
else
MSGBOX "ОШИБКА!!!!"
end if
поставь этот код прям в начало функции OpenDB()
а при выполнении CloseDB() установи значение testOpen в 0
так вот есчли за время работы программы хоть раз вылезет месайдж бокс ищи ошибки в коде так как у тебя идёт опять создание объекта... перед тем как старый объект уничтожен +)
Есть и другой способ для извращенцев сделай свой код вот такой...
Public Sub OpenDB()
CloseDB()
Set RecSet = New ADODB.Recordset
Set OraDB = New ADODB.Connection
Set OraCMD = New ADODB.Command
RecSet.CursorLocation = adUseClient
If OraDB.State <> 1 Then
OraDB.Open "otchet", LO, PW
OraCMD.ActiveConnection = OraDB
End If
If RecSet.State <> 1 Then
RecSet.ActiveConnection = OraDB
End If
End Sub
То бишь перед открытием базы всегда будет вызываться код который удалит старые объекты... и ты можешь забыть .... про вызов самому CloseDB() так как он сам будет вызыатся каждый раз при открытии базы..
Номер ответа: 5
Автор ответа:
sYstEmiZer
ICQ: 280647023
Вопросов: 16
Ответов: 45
Профиль | | #5
Добавлено: 25.05.04 17:34
Сделал по первому способу. Никаких ошибок не выпадает. Память все равно утекает
Номер ответа: 6
Автор ответа:
sYstEmiZer
ICQ: 280647023
Вопросов: 16
Ответов: 45
Профиль | | #6
Добавлено: 26.05.04 09:29
Народ! Помогите, кто может - проверьте маленький кодик. У меня на нем страшно утекает память. Для выполнения нужен любой коннект к базе через ODBC по ADO 2.7.
Модуль формы:
Dim D As Date
Private Sub Form_Load()
Timer1.Interval = 5000
Timer1.Enabled = True
  = DateAdd("s", 5, Now)
End Sub
Private Sub Timer1_Timer() 'это таймер
If Now >= D Then
Call Buffer.OpenDB
Call Buffer.CloseDB
End If
End Sub
это код модуля "buffer"
Public OraDB As ADODB.Connection
Public Sub OpenDB()
Set OraDB = New ADODB.Connection
OraDB.Open "otchet", LO, PW
End Sub
Public Sub CloseDB()
OraDB.Close
Set OraDB = Nothing
End Sub
Утекает ли у вас память? :?:
Номер ответа: 7
Автор ответа:
sYstEmiZer
ICQ: 280647023
Вопросов: 16
Ответов: 45
Профиль | | #7
Добавлено: 26.05.04 12:19