Inactividad Mysql+ADO - (Solucionado)

Inactividad Mysql+ADO - (Solucionado)

Postby leandro » Fri Jul 12, 2013 2:41 am

Amigos del foro tengan buenas noches...

Pues como dice el encabezado, tengo problemas de inactividad en mi sistema, trabajo con mysql y ado. En el localhost no hay ningún problema, todo corre a las mil maravillas. Pero resulta y pasa que monte el sistema en un WINDOWS SERVER 2003. y después de un minuto se cae la conexión con la base de datos.

Opte por colocar un timer para que hiciera una consulta cada 20 segundos, pero de esto me genero dos problemas. 1- Se ponen un poco lentas las demás consultas. y 2- Cuando cierro el dialogo de captura y quiero abrir otro dialogo me sale el error MsgStop( "No se ha podido ejecutar el comando !", "Error de Datos" ).

Code: Select all  Expand view  RUN

oVar:="SELECT s_indice,s_permis,s_llaves,s_nmenus,s_autori,s_verifi,s_usuari,s_proced,s_madres from " + oLamcla:tPerm +" WHERE s_indice='"+alltrim(oLamcla:vColl)+nMenu+"'"
TRY
  oTMe := CreateObject("ADODB.Recordset")
CATCH oError
  MsgStop(oLamcla:mErnt,oLamcla:mErco)
  RETURN(.F.)
END
oTMe:CursorLocation  := adUseClient //adUseServer
oTMe:LockType        := adLockOptimistic
oTMe:CursorType      := adOpenKeyset
oTMe:Source          := oVar
oTMe:ActiveConnection( oLamcla:oConPer )
TRY
  oTMe:Open()
CATCH oError
  MsgStop(oLamcla:mComa,oLamcla:mDato)
END
nRegistros := oTMe:RecordCount() //esta es la linea donde me marca el error.
IF nRegistros > 0

..........
 


Luego me saca del sistema y me arroja el siguiente error.

Code: Select all  Expand view  RUN

Descripción de la Applicación:
___________________________________________________

Ubicación y Nombre: C:\DlymAdo.1\Contable.Exe (32 BITS)
Desde la Estación de Trabajo: CASA
Usuario en Sesión: 001
Privilegio del Usuario: 001
Tamaño: 1,343,488 bytes
Hora de Inicio:   Jueves 11 de Julio del 2013,  9:44:14 PM
Hora del Error:   Jueves 11 de Julio del 2013,  9:44:14 PM
Tiempo de Sesión: 0 hours 15 mins 38 secs


Descripción del Error:
___________________________________________________

Error ADODB.Recordset/6  
DISP_E_UNKNOWNNAME: RECORDCOUNT
   Args:


Llamadas al Stack:
___________________________________________________

Llamado desde TOLEAUTO:RECORDCOUNT(0)
Llamado desde TLYMA:AUTORIZA(1072)
Llamado desde (b)MAIN(374)
Llamado desde TRBTN:CLICK(676)
Llamado desde TRBTN:LBUTTONUP(854)
Llamado desde TCONTROL:HANDLEEVENT(1690)
Llamado desde TRBTN:HANDLEEVENT(1520)
Llamado desde _FWH(3153)
Llamado desde WINRUN(0)
Llamado desde TWINDOW:ACTIVATE(980)
Llamado desde MAIN(454)
Llamado desde R32_MENU(138)
 


Alguien tiene alguna idea de como solucionar este problema de inactividad. O si tiene alguna sugerencia.

Saludos
Last edited by leandro on Fri Jul 12, 2013 11:56 pm, edited 1 time in total.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Inactividad Mysql+ADO

Postby ricardog » Fri Jul 12, 2013 5:51 pm

Yo hago esto

En el ON INIT de mi ventana principal

ON INIT .......
oTimerMata := TTimer():New( 60000, { || MataProcesos(oTimerMata) } ),; //60,000 milisegundos = 60 segundos
oTimerMata:Activate(),;
.........

Y la Funcion

Code: Select all  Expand view  RUN
FUNCTION MataProcesos(oTimerx)
LOCAL oRsData, oErr, lOn:=.F.

      oTimerx:deactivate()

      IF oSys:cMotor = "MYSQL" .OR. oSys:cMotor = "MARIADB"
          oRsData:=NIL
        TRY
             oRsData:=TOleAuto():New( "ADODB.RecordSet" )
             oRsData:CursorLocation   := adUseClient
             oRsData:CursorType       := adOpenKeyset
             oRsData:ActiveConnection := oTerminal:cStrConn
             oRsData:Source           := "show full processlist"
             oRsData:Open()
             oRsData:Sort := "time DESC"   //Lo organizo por la columan TIEMPO en forma DESCENDENTE
        Catch oErr
             oTimerx:activate()
           RETURN NIL
        END

        WHILE !oRsData:Eof()
               IF UPPER(oRsData:Fields("command"):value) = "SLEEP"
                 IF oRsData:Fields("time"):value >= 50           //Los que tengan mas de 50 segundos estan "dormidos" (ya no se estan utilizando)
                    TRY
                       oTerminal:oConn:Execute( "kill "+LTrim(Str(Int(oRsData:Fields("id"):value))) )
                    CATCH
                    END
                 ENDIF
               ENDIF
             oRsData:MoveNext()
        END
      ENDIF
      oRsData:Close()
      oTimerx:activate()

RETURN Nil


Espero te ayude.
Saludos
ricardog
 
Posts: 158
Joined: Tue Oct 11, 2005 3:10 pm

Re: Inactividad Mysql+ADO

Postby leandro » Fri Jul 12, 2013 10:44 pm

Amigos del foro tengan buena tarde...


Ricardo amigo muchas gracias por la ayuda... Inicialmente tu función no me soluciono el problema, pero me dio la luz que necesitaba y encontré la respuesta al problema.
Resulta que tenia una conexión que se usa únicamente al inicio del programa, pero que nunca la cerraba, entonces estaban quedando dos conexiones activas con el
mismo nombre y con el mismo id.

El timer que coloque únicamente actualizaba una de las dos conexiones, la otra no, pero al ejecutar otro comando el sistemas confundía la que estaba
activa con la inactiva y por esto se reventaba el programa.

De todas formas tu función me fue de mucha utilidad. Pero dicen que cada persona tiene su forma de matar las pulgas así que la modifique y quedo de la siguiente manera:
hace lo mismo pero con otras palabras

Code: Select all  Expand view  RUN

FUNCTION MataProcesos( )
LOCAL oVar

oVar:="SELECT * FROM information_schema.PROCESSLIST order by time DESC;"
TRY
  oConsTA := CreateObject("ADODB.Recordset")
CATCH oError
  MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
  RETURN(.F.)
END
oConsTA:CursorLocation  := adUseClient //adUseServer
oConsTA:LockType        := adLockOptimistic
oConsTA:CursorType      := adOpenKeyset
oConsTA:Source          := oVar
oConsTA:ActiveConnection( oLamcla:oServer )
TRY
  oEmpr:Open()
CATCH oError
  MsgStop( "No se ha podido ejecutar el comando !", "Error de Datos" )
  RETURN(.F.)
END
nRegistros := oEmpr:RecordCount()

Do While !oConsTA:Eof()
  vTCom:=oConsTA:Fields( "command" ):Value
  vTIde:=oConsTA:Fields( "id" ):Value
  vTTie:=oConsTA:Fields( "time" ):Value

  *******************************************
  if vTCom="sleep" .and. vTTie>60
    vConsCB:="kill "+LTrim(Str(Int(oConsTA:Fields("id"):value)))
    TRY
      oLamcla:oServer:Execute(vConsCB)
    CATCH oError
      MsgInfo(oLamcla:mRegi,oLamcla:mDato)
    END
  endif

  oConsTA:MoveNext()
EndDo
oConsTA:close()
 


Ricardo nuevamente gracias.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Inactividad Mysql+ADO

Postby ricardog » Fri Jul 12, 2013 11:26 pm

Me alegra que hays encontrado la solución.

Saludos desde México.
ricardog
 
Posts: 158
Joined: Tue Oct 11, 2005 3:10 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 40 guests