Стремительно утекает память

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Стремительно утекает память

Сообщение sYstEmiZer » 25.05.2004 (Вт) 10:50

На простых операциях откытия и закрытия БД. Код такой:

Код: Выделить всё
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


Выполняются полседовательно по таймеру каждые 5 секунд. Сначала открытие, потом закрытие. Утекает где-то 1 мег за 5 минут
С переподвыподвертом!

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.05.2004 (Вт) 11:18

Хм, ну а если понаблюдать, скажем, часа 2-3? Все сожрется и умрет, или так и остановится на этом метре?
Если остановится, то скорее всего память уходит в пул соединений. Он потом ее отдаст, никуда не денется. Ну а если нет... надо копать глубже.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Стремительно утекает память

Сообщение codemaster » 25.05.2004 (Вт) 11:28

sYstEmiZer писал(а):На простых операциях откытия и закрытия БД. Выполняются полседовательно по таймеру каждые 5 секунд. Сначала открытие, потом закрытие. Утекает где-то 1 мег за 5 минут



А зачем в интервале 5 секунд открывать и закрывать базу?

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Сообщение sYstEmiZer » 25.05.2004 (Вт) 11:50

Ennor писал(а):Хм, ну а если понаблюдать, скажем, часа 2-3? Все сожрется и умрет, или так и остановится на этом метре?
Если остановится, то скорее всего память уходит в пул соединений. Он потом ее отдаст, никуда не денется. Ну а если нет... надо копать глубже.


В том то и дело, что не останавливается, а все время увеличивается. До упора не проверял памяти слишком много :D
С переподвыподвертом!

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Re: Стремительно утекает память

Сообщение sYstEmiZer » 25.05.2004 (Вт) 11:53

codemaster писал(а):
sYstEmiZer писал(а):На простых операциях откытия и закрытия БД. Выполняются полседовательно по таймеру каждые 5 секунд. Сначала открытие, потом закрытие. Утекает где-то 1 мег за 5 минут



А зачем в интервале 5 секунд открывать и закрывать базу?


Между этим открытием и закрытием выполняются некоторые дествия. А держать все время базу открытой как-то некорректно, ИМНО.
С переподвыподвертом!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.05.2004 (Вт) 12:00

Да нет, логичнее держать базу открытой все то время, пока выполняются какие-то действия, закрывая ее только при выходе. Или ты работаешь с MDB-файлом?
Lasciate ogni speranza, voi ch'entrate.

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Сообщение sYstEmiZer » 25.05.2004 (Вт) 12:12

alibek писал(а):Да нет, логичнее держать базу открытой все то время, пока выполняются какие-то действия, закрывая ее только при выходе. Или ты работаешь с MDB-файлом?


Так и происходит. Работаю через ODBC (ADO 2.7), база FB 1.5, если это поможет.
С переподвыподвертом!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 25.05.2004 (Вт) 14:16

sYstEmiZer писал(а):
alibek писал(а):Да нет, логичнее держать базу открытой все то время, пока выполняются какие-то действия, закрывая ее только при выходе. Или ты работаешь с MDB-файлом?


Так и происходит. Работаю через ODBC (ADO 2.7), база FB 1.5, если это поможет.


ты можешь открыть "глобальный" Connect к БД
в процессе работы можно пользовать открытый Connect для выполнения Command или RS .

P.S. из твоего кода мало понятно что используется :
Command или Recordset. Если результатом выполнеия Command является Recordset то зачем
Код: Выделить всё
Set RecSet = New ADODB.Recordset
????

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Сообщение sYstEmiZer » 25.05.2004 (Вт) 15:45

Хм....Может быть разгадка как раз в способе подключения?
Как правильно подключаться к базе?
Способ1:
Код: Выделить всё
RecSet.Open s, OraDB


Способ 2
Код: Выделить всё
OraCMD.CommandText = s
Set RecSet = OraCMD.Execute


Какой способ более правильный и ест меньше памяти. Потому что работают вроде оба.
С переподвыподвертом!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 25.05.2004 (Вт) 18:27

sYstEmiZer писал(а):Хм....Может быть разгадка как раз в способе подключения?
Как правильно подключаться к базе?
Способ1:
Код: Выделить всё
RecSet.Open s, OraDB


Способ 2
Код: Выделить всё
OraCMD.CommandText = s
Set RecSet = OraCMD.Execute


Какой способ более правильный и ест меньше памяти. Потому что работают вроде оба.



к БД ты подключаешся через ADO.Connection !!!!

Что касается что использовать Command или Recordset все зависит от задачи (кстати в топике о ней ни слова .... ) и дизайна БД . Подробно пользование Command , Recordset и пр. расписано в MSDN.

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Сообщение sYstEmiZer » 26.05.2004 (Ср) 8:31

Народ! Помогите, кто может - проверьте маленький кодик. У меня на нем страшно утекает память. Для выполнения нужен любой коннект к базе через 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


Утекает ли у вас память? :?:
С переподвыподвертом!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 05.02.2005 (Сб) 18:27

на полуторке не работал (дятел использую)
переконнекта не делай, а явно управляй транзакциями.
клоны интербейза версионные и память может расходоваться на эту версионность.
зайди на http://www.ibase.ru и почитай по поводу управления транзакциями.
стартуй транзакции по мере необходимости и сразу делай соммит или роллбек.
качни оттуда утилиты для просмотра состояния базы.
Постав IBExpert - это аналог консоли управления MSSQL.
там будет и статистика по базе и можно оптимизировать запросы

есть фришный IBProvider со справкой на русском
я им пользовался когда надо было
на ибейс.ру есть ссылка

кстати код не работает нужно создавать источник данных
и объявлять переменные LO, PW

sYstEmiZer
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 18.03.2004 (Чт) 13:06
Откуда: Москва

Сообщение sYstEmiZer » 07.02.2005 (Пн) 9:18

to Igor_123

Спасибо за ответ. Но проблема уже решена силами программистов драйвера от phoenix. Память действительна утекала в случае использования ADO. В новых версиях ошибка исправлена, огромное спасибо Владимиру Цвигуну (MP Praktik) - координатору проекта Phoenix ODBC Driver.
С переподвыподвертом!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 07.02.2005 (Пн) 9:57

Кстати, если интересно там хороший ньюс: forums.demo.ru


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 36

    TopList