Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Стремительно утекает память. Добавлено: 25.05.04 13:51  

Автор вопроса:  sYstEmiZer | ICQ: 280647023 

В коде происходят некие действия каждые 5 секунд по таймеру, а именно БД открывается что-то происходит и потом закрывается. Так вот проверил, "что-то" память не ест. А вот открытие и закрытие съедает 1 мег за 5 минут. Код такой:

Public Sub OpenDB()
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

Способ связи с БД FB 1.5 (на всякий случай) ODBC (ADO 2.7).

ОФФ: Новый форум просто супер, но мааааленький вопросик - а поиск по форуму когда будет?

Ответить

Номер ответа: 2
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #2
Добавлено: 25.05.04 15:20
Это конечно не ответ на твой вопрос но код логичке правильный создал объект... а потом когда присваеваешь ... указателю на объект ... НУЛ... то система сбора мусора сама должэна очистить память ... опиши подробнее как и когда ты открываешь и закрываешь .. может быть ты два раза... открываешь базау случайно и тд итп...

Ответить

Номер ответа: 3
Автор ответа:
 sYstEmiZer



ICQ: 280647023 

Вопросов: 16
Ответов: 45
 Профиль | | #3 Добавлено: 25.05.04 16:06
А можно как-нибудь отследить какая конкретно переменная сколько памяти юзает?

Ответить

Номер ответа: 4
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #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
    ;D = 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

Помогите!!!! Кто-нибудь!!! У всех такая засада или нет?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам