Autor Tema: Como evitar cuelgues de consultas a la BD en host  (Leído 5426 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Como evitar cuelgues de consultas a la BD en host
« en: Septiembre 01, 2013, 03:03:52 am »
No pude crear un titulo coherente me parece. Explico

Tengo una BD MySQL alojada en "la nube". Desde un aplicativo VB6 que consta de un solo formulario me conecto a ella insertando datos y leyéndolos.

A esta BD la atacamos desde 2 o 3 puntos diferentes, por tanto cambia. Estos cambios los vemos reflejados en un formulario que hace la consulta a la BD cada segundo. Hasta aquí todo bien.

Como era de esperarse un usuario (en este caso el dueño) se le ocurrió mover el formulario y este se colgaba naturalmente en la parte donde el aplicativo hace la consulta a la BD y de alli se le ocurrio que no desea que se cuelgue porque ademas el quiere interactuar con otros controles dentro de ese formulario.

Pregunta ¿Es posible que la consulta a la BD se realice como "en segundo plano" para que el formulario no se cuelgue?.

Agrego ademas que la tabla es apenas de un par de registros y 10 campos y esos 2 registros se actualizan constantemente, no estamos hablando de datos voluminosos.

Saludos
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #1 en: Septiembre 02, 2013, 12:33:53 pm »
creo que por ahi hay un ejemplo de como hacer un thread en VB6 y meter un proceso para que no se cuelgue.

aca te dejo un ejemplo de una api basica que se usa para eso, pero no se si te sirve.

el ejemplo hace un bucle infinito, que sin esa api, el formulario no se podria mover.

Código: (vb) [Seleccionar]
Private Declare Function GetQueueStatus Lib "user32" (ByVal qsFlags As Long) As Long

Private Sub NewDoEvents()
    If GetQueueStatus(255) <> 0 Then DoEvents
End Sub

Private Sub Command1_Click()
    Dim i As Long
    Do While 1 = 1
        i = i + 1
        NewDoEvents
    Loop
End Sub

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #2 en: Septiembre 02, 2013, 01:33:26 pm »
A ver a ver, voy a probar, gracias Sebas.

EDITO: El código efectivamente funciona, se comprueba colgando sin el NewDoEvents, pero cuando lo aplico a mi proyecto no funca ya que igual se cuelga por un par de segundos, quizá no se pueda aplicar este tema a datos. He colocado el NewDoEvents en varios lugares, antes de la consulta, después de la consulta y efectivamente no participa de la orden que provoca el cuelgue, ej: cn.open, no hay forma de "meterlo dentro". ¿no habrá algo a nivel de ADO?

Ahora, como es una consulta a una BD alojada en un host al cual me conecto y desconecto por cada consulta. Por probar hice la conexión una sola vez (como lo hago normalmente en BDs locales) y en la parte cn.Open es donde el cuelgue es mayor (hasta 2 segundos), luego en cada "rs.Open "SELECT * FROM TABLA", db, 1, 1" sigue el cuelgue pero dura menos (medio segundo digamos) pero es igual de molesto. Por tanto al no ser una solución preferi hacer la conexión por cada consulta.

La única forma que se me ocurre para resolver esto es que sea otro el aplicativo que lea al host y ese otro aplicativo llene una BD local y leer desde ella... un tema en la sincronización de las consultas pero bueno no se me ocurre otra.


« última modificación: Septiembre 02, 2013, 02:52:15 pm por YAcosta »
Me encuentras en YAcosta.com

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #3 en: Septiembre 11, 2013, 06:33:31 pm »
Hola en ADO, hay un parametro para los Open de las conexiones o Recordset. que se llama adAsyncExecute, no se si investigaste por ese lado.

Alguna vez jugue con eso, y cuando llamas al Open o Execute, inmediatamente sigue la ejecucion del programa, sin bloquearlo

Te paso un ejemplo del Help de Ado que supongo que puede servirte

Ejemplo de la propiedad State

Este ejemplo utiliza la propiedad State para mostrar un mensaje al mismo tiempo que se abren conexiones asíncronas y se ejecutan comandos asíncronos.

Código: (VB) [Seleccionar]
Public Sub StateX()
Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cmdChange As ADODB.Command
Dim cmdRestore As ADODB.Command
Dim strCnn As String


'Abre dos conexiones asíncronas que muestran
'un mensaje mientras se conectan.

Set cnn1 = New ADODB.Connection
Set cnn2 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

cnn1.Open strCnn, , , adAsyncConnect
While (cnn1.State = adStateConnecting)
   Debug.Print "Abriendo la primera conexión..."
Wend

cnn2.Open strCnn, , , adAsyncConnect
While (cnn2.State = adStateConnecting)
   Debug.Print "Abriendo la segunda conexión..."
Wend

'Crea dos objetos Command.

Set cmdChange = New ADODB.Command
cmdChange.ActiveConnection = cnn1
cmdChange.CommandText = "UPDATE títulos SET tipo = 'auto_ayuda' " & _
"WHERE tipo = 'psicología'"

Set cmdRestore = New ADODB.Command
cmdRestore.ActiveConnection = cnn2
cmdRestore.CommandText = "UPDATE títulos SET tipo = 'psicología' " & _
"WHERE tipo = 'auto_ayuda'"

'Ejecuta los comandos y muestra un mensaje al mismo tiempo.

cmdChange.Execute , , adAsyncExecute

While (cmdChange.State = adStateExecuting)
   Debug.Print "Cambiando el comando en ejecución..."
Wend

cmdRestore.Execute , , adAsyncExecute

While (cmdRestore.State = adStateExecuting)
   Debug.Print "Restaurando el comando en ejecución..."
Wend

cnn1.Close
cnn2.Close
End Sub
« última modificación: Septiembre 12, 2013, 12:44:52 am por YAcosta »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #4 en: Septiembre 12, 2013, 12:45:18 am »
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos
Me encuentras en YAcosta.com

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #5 en: Septiembre 16, 2013, 07:02:11 pm »
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos

Si necesitas una respuesta al terminar la consulta, no te servirá...! Más sin embargo, si deseas ejecutar unas instrucciones SQL y continuar trabajando normal, esta es la mejor opción...!

Saludos
Miguel Núñez.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #6 en: Septiembre 16, 2013, 07:58:36 pm »
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos

Si necesitas una respuesta al terminar la consulta, no te servirá...! Más sin embargo, si deseas ejecutar unas instrucciones SQL y continuar trabajando normal, esta es la mejor opción...!

Saludos

Asi es, no la necesito, solo necesito insertar desde el aplicativo nada mas y es desde web hacer la consulta, esa solucion va perfecto.
Me encuentras en YAcosta.com

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Como evitar cuelgues de consultas a la BD en host
« Respuesta #7 en: Septiembre 16, 2013, 09:35:46 pm »
Si declaras el objeto with events hay un par de eventos, si mal no recuerdo hay un ExecuteComplete, que puede servir para saber cuando termino