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! |