Foros del Web » Programando para Internet » ASP Clásico »

Error: Terminó el tiempo de espera

Estas en el tema de Error: Terminó el tiempo de espera en el foro de ASP Clásico en Foros del Web. Hola a todos, espero me puedan ayudar con este problema que tengo. Sucede lo siguiente: Estoy generando un reporte en exel con ASP colocandole lo ...
  #1 (permalink)  
Antiguo 13/01/2010, 07:12
 
Fecha de Ingreso: enero-2010
Mensajes: 6
Antigüedad: 14 años, 10 meses
Puntos: 0
Error: Terminó el tiempo de espera

Hola a todos, espero me puedan ayudar con este problema que tengo. Sucede lo siguiente:

Estoy generando un reporte en exel con ASP colocandole lo siguiente:
<%Response.ContentType = "application/vnd.ms-excel"%>

Para ello realizo un select y dentro del bucle que hago para poder generar las filas respectivas realizo update's, son update's simples como :

UPDATE Visitas SET cod_comision=" & cod_recibo & " WHERE cod_comision is null and nroVisita <= " & totalComisionar & " and cod_regi='" & reclocal("Codigo_Registro") & "'

sin embargo me sale un error de tiempo de espera cuando se quiere ejecutar el update, no se ejecuta niguno del bucle. Cuando lo obtengo por un print y lo ejecuto en mi Analizador de consultas corre y rápido sin ningun problema(en 1 segundo)

Observaciones:
- Si quito el update todo funciona correctamente.
- Ya intente colocandole a Response.Expires = -1
- Ya intente colocandole Server.ScriptTimeOut = 86000 o 0
- Ya intente colocandole CommandTimeOut = 600 o 0
- Le he creado indices a la tabla
- Le he quitado el tiempo de espera a la Base de datos con la siguiente funcion
sp_configure 'remote login timeout', 0
go
reconfigure with override
go

El mensaje completo del error es:
Proveedor de Microsoft OLE DB para SQL Server (0x80040E31)
Terminó el tiempo de espera

Estoy usando SQL 7.0 y ASP por si le es necesario. Creanme q ya intente todo, no se me ocurre nada mas. Por favor necesito ayuda URGENTE !!!!
  #2 (permalink)  
Antiguo 14/01/2010, 12:51
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Respuesta: Error: Terminó el tiempo de espera

Cita:
Iniciado por D_a_n_n_y Ver Mensaje
Hola a todos, espero me puedan ayudar con este problema que tengo. Sucede lo siguiente:

Estoy generando un reporte en exel con ASP colocandole lo siguiente:
<%Response.ContentType = "application/vnd.ms-excel"%>

Para ello realizo un select y dentro del bucle que hago para poder generar las filas respectivas realizo update's, son update's simples como :

UPDATE Visitas SET cod_comision=" & cod_recibo & " WHERE cod_comision is null and nroVisita <= " & totalComisionar & " and cod_regi='" & reclocal("Codigo_Registro") & "'

sin embargo me sale un error de tiempo de espera cuando se quiere ejecutar el update, no se ejecuta niguno del bucle. Cuando lo obtengo por un print y lo ejecuto en mi Analizador de consultas corre y rápido sin ningun problema(en 1 segundo)

Observaciones:
- Si quito el update todo funciona correctamente.
- Ya intente colocandole a Response.Expires = -1
- Ya intente colocandole Server.ScriptTimeOut = 86000 o 0
- Ya intente colocandole CommandTimeOut = 600 o 0
- Le he creado indices a la tabla
- Le he quitado el tiempo de espera a la Base de datos con la siguiente funcion
sp_configure 'remote login timeout', 0
go
reconfigure with override
go

El mensaje completo del error es:
Proveedor de Microsoft OLE DB para SQL Server (0x80040E31)
Terminó el tiempo de espera

Estoy usando SQL 7.0 y ASP por si le es necesario. Creanme q ya intente todo, no se me ocurre nada mas. Por favor necesito ayuda URGENTE !!!!

Por el tipo de error y la descripción que das, a mi me parecería que es un problema con tu ciclo, quizás tenga alguna condición en la que se convierte en un ciclo infinito.

Otra cosa podría ser que tu set de datos sea inmenso, con lo cual desde luego es muchísimo más lento manejarlo desde la capa de aplicación que a nivel de base de datos, por eso es que si lo corres en tu query analizer será rápido, pero no necesariamente será así si lo haces desde el código duro.

Tendrías que poner el código relevante para este problema a ver si te podemos ayudar a resolver el misterio.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 15/01/2010, 07:31
 
Fecha de Ingreso: enero-2010
Mensajes: 6
Antigüedad: 14 años, 10 meses
Puntos: 0
Exclamación Respuesta: Error: Terminó el tiempo de espera

U_GOLDMAN, en primer lugar gracias por el interes puesto al caso. Con respecto a la consulta el bucle que genero es simplemente recorrer mi record set sin ninguna condicion mas.

Do while not reclocal.EOF

UPDATE Visitas SET cod_comision=" & cod_recibo & " WHERE cod_comision is null and nroVisita <= " & totalComisionar & " and cod_regi='" & reclocal("Codigo_Registro") & "'

reclocal.Movenext
Loop


Esa es la estructura general, por otro lado tienes razon en esta tabla a la que quiero hacer el update tengo una gran cantidad de informacion registrada, seran 150 registros por día y el sistema tiene algo de 4 años, imaginaras la cantidad de información que se tiene. Es por ello que le cree indices a mi tabla para q no demore tanto.

Lo curioso es q no corre ningún update, al ponerle CommandTimeOut en 600 espera mas pero yo creo q asi mi aplicacion espere 1 día entero el update no se va a ejecutar, y cuando digo q no se va a ejecutar me refiero a q ni siquiera el primero del bucle.

PD. No creo q sea un problema con el bucle xq como mencione al inicio si le quito el update funciona correctamente.
  #4 (permalink)  
Antiguo 15/01/2010, 09:08
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Respuesta: Error: Terminó el tiempo de espera

Hola D_a_n_n_y,
Entonces me imagino que el problema es en efecto la cantidad de registros que tiene, has tratado devolver un un set de datos mas chico vamos a decir limitado por fecha? Finalmente no creo que nadie quiera ver un excel con 100,000 registros.

Yo trataría de ponerle alguna fecha, vamos a decir que regrese inicialmente los registros del último mes y en base a eso corres haces los updates necesarios.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #5 (permalink)  
Antiguo 15/01/2010, 09:17
 
Fecha de Ingreso: enero-2010
Mensajes: 6
Antigüedad: 14 años, 10 meses
Puntos: 0
Exclamación Respuesta: Error: Terminó el tiempo de espera

Efectivamente, ademas que el excel no lo soportaría. Pero el bucle que tengo solo trae a lo máximo 900 registros. Lo que te indico que tiene un monton de informacion es mi tabla, mas no mi consulta.
  #6 (permalink)  
Antiguo 15/01/2010, 12:25
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Respuesta: Error: Terminó el tiempo de espera

Hola D_a_n_n_y,
Si que está raro, pero ¿Cuál es la tabla que tiene muchos campos, la que actualizasy cuántos son exactamente "un monton"? La verdad que se me hace muy extraño que te esté haciendo un timeout por solamente 900 tristes registros, necesitaríamos ver tu código.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #7 (permalink)  
Antiguo 16/01/2010, 15:19
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 8 meses
Puntos: 88
Respuesta: Error: Terminó el tiempo de espera



no ha tratado de simplemente poner un response.flush en determinados X registros para que mande algo y se cree mas rapido la consulta?

__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #8 (permalink)  
Antiguo 16/01/2010, 20:59
 
Fecha de Ingreso: abril-2004
Ubicación: México D.F.
Mensajes: 1.724
Antigüedad: 20 años, 7 meses
Puntos: 4
Re: Error: Terminó el tiempo de espera

Hola :

¿ has intentado poner en tu consulta un top 10 para verificar si efectivamente actualiza al menos los 10 registros ?

intenta desplegar el reporte en la misma página y deshabilita el buffer con response.buffer=false
  #9 (permalink)  
Antiguo 18/01/2010, 08:04
 
Fecha de Ingreso: enero-2010
Mensajes: 6
Antigüedad: 14 años, 10 meses
Puntos: 0
Exclamación Respuesta: Error: Terminó el tiempo de espera

Como les mencione el problema no es cuanto se demore la consulta, ni cuantos registros trae, el problema es al realizar el update, la consulta es rápida si ejecuto el select demora 1 segundo la ejecucion del programa(obviamente comentando los updates). Pero de todas maneras he realizado sus sugerencias, sin embargo con ninguna respuesta satisfactoria. Cuando coloque el codigo response.buffer= false abrio el excel, pero al guardarlo o abrirlo se queda esperando y al final me sale el mensaje de error en el excel =( . Solo listó la primera columna y obviamente no ejecuto ni si quiera el primer update.

Como comentario es que dentro del bucle tengo 2 updates, el primero si se esta ejecutando sin embargo el segundo es el q no se ejecuta ni 1 sola vez, al hacer el update se queda esperando toda una eternidad y nunca se logra ejecutar
Los updates son de tablas distintas.

Espero q no se den por vencidos, y me envien mas sugerencias para poder dar una posible solución, gracias de antemano.

U_GOLDMAN : La tabla q tiene bastantes registros es a la q le hago el update, como te mencione el codigo que puse en una anterior vez es todo el codigo, mi select entero es demasiado grande y no creo q venga al caso colocarlo.
Shiryu_Libra : Con el flush solo me lista el primer registro luego se cae (No realiza ningún update)
orharo2003 : Con el top 10 y top 5 da lo mismo se cae al hacer el primer update.
  #10 (permalink)  
Antiguo 18/01/2010, 09:05
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 9 meses
Puntos: 146
Respuesta: Error: Terminó el tiempo de espera

a veeeeerrrr ....

Si entendí bien, el problema es que al llegar el IIS a la linea Connection.Execute("UPDATE etc etc etc") esta nunca se ejecuta, el intérprete se queda ahí esperando "algo" hasta que marca error de tiempo de espera, ¿es correcto?

Esto entonces debe ser por que el recurso no esta liberado y el IIS se queda esperando inútilmente a que este disponible. Pregunta: ¿Tienes alguna transacción no terminada y donde haya algo que afecte esa tabla antes del UPDATE?, si es así, entonces seguramente tienes un "abrazo mortal"

Supongo que cuando ejecutas el update en el analizador de consultas no tienes problemas por que tanto la tabla esta completamente libre y el usuario tienen completo acceso a esta.

En lo particular pienso que el error esta de ese lado.

Yo iría debugueando mi código, acotando sentencias hasta encontrar cual es la que hace que el UPDATE falle, estoy casi seguro (dependiendo de la cadena de conexión) que ese UPDATE solo si funciona desde ASP; hay "algo" que mantiene agarrada a la tabla y no la suelta (o alguna que sea llamada por algún trigger) y por eso truena el update

Esa es mi teoría
  #11 (permalink)  
Antiguo 18/01/2010, 14:53
 
Fecha de Ingreso: enero-2010
Mensajes: 6
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Error: Terminó el tiempo de espera

Myakire efectivamente se trataba de un deadlock( Abrazo mortal ),

Al generar mi select y al hacer mi update usaba esta estructura:
recActVisitas.open str, cn, 0, 1

Le hice la modificacion a lo siguiente para ambos recordset :
recActVisitas.open str, cn, 2, 3

Y se solucionó el problema =D

Adjunto alguna informacion de estos números para las personas que no sabían mucho sobre el tipo de cursor y el cerrojo del cursor (asi como yo)

tipo de Cursor
Entendemos como cursor el puntero que nos permite desplazarnos por los registros del recordset. Dependiendo del tipo elegido determinaremos los desplazamientos y cambios realizables en los datos.

adOpenForwardOnly 0 Es el cursor por defecto, solo nos permite recorrer la tabla de forma secuencial (no se puede volver hacia atrás) y no permite modificaciones en los registros. Por contra es el de menos consumo. No vemos los cambios realizados en la tabla por otro recordset.
adOpenKeyset ( 1 ) Nos permite movernos en los dos sentidos, si permite modificaciones en los registros. Vemos los cambios realizados en la tabla por otro recordset a excepción de las nuevas altas.
adOpenDynamic ( 2 ) Nos permite movernos en los dos sentidos, si permite modificaciones en los registros. Vemos Todos los cambios realizados en la tabla por otro recordset.
adOpenStatic ( 3 ) Nos permite movernos en los dos sentidos, no permite modificaciones en los registros. No vemos los cambios realizados en la tabla por otro recordset.


tipo de Cerrojo
Entendemos como cerrojo el tipo de bloqueo que efectuaremos en la base de datos cuando modifiquemos un recordset, a fin de evitar que dos o mas usuarios accedan a modificar un mismo registro a la vez.

adLockReadOnly( 1 ) Es el defecto; no permite al usuario modificar los datos de la tabla.
dLockPessimistic ( 2 ) Cuando se abra la tabla nadie mas podrá hacerlo, este modo nos asegura la plena integridad de los datos.
adLockOptimistic ( 3 ) Cierra la tabla a los demás usuarios cuando se invoque al método Update del objeto recordset; de este modo la Base de datos quedará bloqueada menos tiempo que con el método anterior.

Por último muchas gracias a todos por intentar dar solución a mi problema.

Etiquetas: espera
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:39.