La Web del Programador: Comunidad de Programadores
 
    Pregunta:  4063 - VISUAL BASIC & ORACLE / OBJECTS FOR OLE
Autor:  Jose Ignacio Gonzalez Lorente
Tengo un problema de perdida de memoria trabajando con:
- W. NT
- Visual Basic 5.0
- Oracle 8.0
Mi problema consiste en que cada vez que creo un Dynaset dentro de un Timer
el programa va ganando memoria, hasta el punto de que como este se ejecuta
las 24 horas, mi sistema se satura, teniendo que resetear cada dos dias.
He probado a desconectarme y volver a conectarme a la BD. Oracle, en cada bucle
de ejecucion, ganando algo, pero sin llegar a solucionar el problema.
No se si estoy haciendolo bien, el caso es que me han hablado de tecnicas de
programacion para Liberar Memoria, y de tecnicas para Objects for OLE, pero
soy incapaz de encontrarlas.
Gracias de antemano.
Hago una cosa como esta:
Dim OraSession As Object
Dim OraDatabase As Object
Dim MsgDynaset As Object
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase(DatabaseAlias, Usuario & "/" & Clave, 0&)
OraDatabase.Parameters.Add "PResolucion", 0, 2
Set MsgDynaset = OraDatabase.DBCREATEDYNASET(sql$, &H8&)
Do While Not MsgDynaset.EOF
kk = Trim$(Str(MsgDynaset.Fields("X")))
kk1 = Trim$(Str(MsgDynaset.Fields("Y")))
sql = "begin Proc_almacenado(" + kk + ",´" + kk1 + "´); commit; end;"
DoEvents
OraDatabase.DBEXECUTESQL (sql)
MsgDynaset.Delete
MsgDynaset.DbMoveNext
loop
MsgDynaset.close
Set MsgDynaset=Nothing

  Respuesta:  Jose Ignacio gonzalez Lorente
El problema es que oracle tiene un Bug que alloca memoria. Se soluciona solicitando a Oracle un parche, Oracle Object for OLE 1.6. Se instala y los problemas de gestion de memoria se solucionan.

  Respuesta:  Ruben Alejandro Romero Mansilla
Se me ocurre que primero que nada saques este codigo del Timer y lo pongas en un procedimiento al cual luego llames desde el timer (si bien parece que no tiene ninguna diferencia si la va a tener) y segundo lo que podrias agregar antes de la ejecucion de dicho procedimiento (dentro del timer) es un procedimiento de control de variables. algo como

if isobject(MsgDynaset) then
Set MsgDynaset = nothing
end if

Saludos

  Respuesta:  Luis Francisco Sorarrain
Hola,
No esta mu y claro el problema, si veo que haces cosas que no tienen funcion apararente como el de mydynaset.close que esta por compatibilidad, si se ve que cerras el cursor.
no se entiende que haces con esos parameters.
si podes hacerlo un poco mas claro lo veo y hasta lo puedo probar donde trabajo yo.
bye!