[Ayuda] MySQL: mysql_free_result() = CRASH
Miguel Cardenas
warlockxxi en yahoo.com
Lun Sep 19 23:29:27 CDT 2005
> Ok, con php estas haciendo la consulta, y quieres
Se esta haciendo con el C API de mysql
> liberar memoria, lo
> que no entiendo es para que quieres hacerlo.
Bueno es que un query a veces me puede devolver mas de
1 resultado, sin embargo solo me interesa leer el
primero que aparezca (que la condicion se cumpla al
menos una vez), por lo que los demas registros no son
extraidos con el mysql_fetch_row()...
Por otro lado, la base de datos actualmente cuenta con
40 mil registros pero crecera bastante mas, realizar
un mysql_store_result() que libere el buffer
automaticamente (si es que realmente lo hace) seria
toda una tragedia en cuanto al buffer cuando se
rebasen los 100,000 o los que sean necesarios para
exceder el tamano del mismo si se quieren extraer en
un solo jalon cuando se haga un reporte de todo el
contenido (que de hecho es la accion principal)...
Como sea, el hacerlo no deberia causar ningun daño aun
si fuera inecesario el uso de dicha funcion,
simplemente serian ciclos de cpu adicionales.
> No has intentado quitarle eso ??
Si lo quito funciona bien, pero si la funcion esta
implementada en la libreria no tiene porque crashearse
(ke slang tan feo :) sin embargo en la documentacion
del C API dice que debe usarse forzozamente despues de
mysql_store_result() y del mysql_use_result() a menos
que haya nuevas especificaciones, el problema es que
el manual disponible no hace mencion de ello.
> mysql_free_result() only needs to be called if you
> are concerned about
> how much memory is being used for queries that
> return large result
> sets. All associated result memory is automatically
> freed at the end
> of the script's execution.
Supongo que esa descripcion me la estas pegando de la
ayuda del php-mysql, ignoro si esa libreria funcione
diferente a la de C... segun el manual en linea dice
asi
You must call mysql_store_result() or
mysql_use_result() for every query that successfully
retrieves data (SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK
TABLE, and so forth).
You don't have to call mysql_store_result() or
mysql_use_result() for other queries, but it does not
do any harm or cause any notable performance
degredation if you call mysql_store_result()
segun dice you must (yo entiendo que es a fuerza), y
tambien dice que no afecta si lo invocas en otros
queries que no devuelvan resultados (insert, create,
etc).
Lo que me intriga es porque se se corrompe, si el uso
de la funcion fuera inapropiado devolveria algun
codigo de error, si ya no fuera necesario habria sido
eliminada hace tiempo del API, pero no haria crash el
programa... orita ya ando en casa asi que puedo
reproducir el error:
*** glibc detected *** double free or corruption
(!prev): 0x08051d58 ***
Aborted
Esto no deberia pasar por liberar recursos, al menos
intuitivamente, pero me dejaste pensando en que todo
se libera al terminar de obtener la informacion...
intentare no terminar de jalar los registros, terminar
antes y ejecutar la funcion, si no hay crash entonces
podria suponer que solo al leer el ultimo registro el
buffer se libera, lo cual seria un problema para mi
pues como saber si quedan mas registros pendientes
para llamar free_result() o no y evitar la caida del
programa.
Bueno como sea gracias por el comentario, ya se me
habia ocurrido esa posibilidad pero ahora que tu
tambien lo mencionas pues me confirma la posibilidad
de que se libera solo, al menos cuando terminas de
leer todos los datos al 100%...
Saludos!
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
_______________________________________________
Ayuda mailing list
Ayuda en linux.org.mx
Para salir de la lista: http://mail.linux.org.mx/cgi-bin/mailman/listinfo/ayuda/
Más información sobre la lista de distribución Ayuda