List:Spanish« Previous MessageNext Message »
From:Jordi Escola (Pricewin) Date:May 17 2006 8:31am
Subject:Re: API C.. HELPPPP
View as plain text  
Genial!.. no me acordaba de los semaforos... tengo la misma aplicación hecha 
en JAVA y  allí ese tema se controla solo...ahora me funciona OK

El problema es que hay bastantes consultas a parte de esta, por lo que quizá 
con mutex tenga problemas de lentitud ...


Gracias a todos por vuestra ayuda!

----- Original Message ----- 
From: "Jose Miguel Pérez" <jruiz@stripped>
To: "Jordi Escola (Pricewin)" <jescola@stripped>; "Ivan Cachicatari" 
<ivancp@stripped>; <mysql-es@stripped>
Sent: Tuesday, May 16, 2006 7:58 PM
Subject: Re: API C.. HELPPPP


Hola Jordi!

    A ver, atacando MySQL con múltiples threads, mmmhhhh... Yo también tengo
una aplicación que hace eso, con una configuración más o menos
parecida.

> Lo curioso que haciendo pruebas simples con threads atacando a la misma
> funcion....

    Dices que varios threads atacan a la misma función, osea esta:

> int ip_baneada(char *ip)
> {
[...]
>    mysql_real_query((MYSQL *)dbase,(char *)query,strlen(query));
>    res = mysql_use_result(dbase);
[...]

    Creo que precisamente ese es el problema, no usas ningún tipo de
serialización para esta función. La librería de MySQL la puedes
compilar
multithead, vale, pero estás usando una sola conexión !!
(mysql_real_connect). NO puedes ejecutar varios threads simultaneamente
compartiendo la misma conexión.

    Te remito específicamente al punto 22.2.15 de la documentación de MySQL
donde dice:

    - "Two threads can't send a query to the MySQL server at the same time
on the same connection[...]"

    (Traducción):
    * Dos threads no pueden enviar un query al servidor MySQL al mismo
tiempo sobre la misma conexión[...]

    Precisamente, dos puntos más abajo da una solución a tu problema:

    - If you want to use multiple threads on the same connection, you must
have a mutex lock around your mysql_query() and mysql_store_result() call
combination [...]

    (Traducción)
    * Si quieres usar multiples threads sobre la misma conexión, debes usar
un semáforo mutex alrededor de las llamadas mysql_query() y
mysql_store_result() [...]

    Por último, yo usaría precisamente esta llamada: "mysql_store_result()"
en lugar de "mysql_use_result()" en caso de programar con threads puesto que
la primera te libera la conexión dado que se trae todo el resultset, en
lugar de tener que ir fila por fila. (Excepto para datos gigantescos, que en
este caso si que no hay más remedio por la memoria que ocupa).

    Para un query simple como es tu caso, no perderás mucho rendimiento (a
menos que realmente muchos threads estén llamando a "ip_baneada")
compartiendo la conexión con un semáforo que te serialice correctamente los
accesos. Quizás, podrías probar a abrir una conexión para cada
thread, pero
aquí tienes que llevar mucho cuidado con el máximo de conexiones que te
puedes permitir.

    Espero ser de ayuda y haberte dado algunas pistas.

    Saludos.
    Jose Miguel.




Thread
API CPricewin)9 May
Re: API CIvan Cachicatari13 May
  • Re: API CPricewin)15 May
    • Re: API CIvan Cachicatari15 May
      • Re: API CPricewin)15 May
      • Re: API C.. HELPPPPPricewin)16 May
      • Re: API C.. HELPPPPJose Miguel PĂ©rez16 May
      • Re: API C.. HELPPPPPricewin)17 May