Pregunta

Recientemente he estado explorando el marco del tornado web para servir a una gran cantidad de conexiones consistentes en lotes de diferentes clientes.

Tengo un controlador de solicitudes que, básicamente, tiene una cadena cifrada RSA y lo descifra. El texto descifrado es una cadena XML que obtiene analizado por un alimentador de documentos SAX que he escrito. Todo funciona perfectamente bien y el tiempo de ejecución (por petición HTTP) fue de aproximadamente 100 milisegundos (con descifrado y análisis).

El XML contiene el nombre de usuario y contraseña hash del usuario. Quiero conectar a un servidor MySQL para verificar que el nombre de usuario coincide con el hash de la contraseña suministrada por la aplicación.

Cuando agrego básicamente el siguiente código:

conn = MySQLdb.connect (host = "192.168.1.12",
                user = "<useraccount>",
                passwd = "<Password>",
                db = "<dbname>")
    cursor = conn.cursor()

    safe_username = MySQLdb.escape_string(XMLLoginMessage.username)
    safe_pass_hash = MySQLdb.escape_string(XMLLoginMessage.pass_hash)

    sql = "SELECT * FROM `mrad`.`users` WHERE `username` = '" + safe_username + "' AND `password` = '" + safe_pass_hash + "' LIMIT 1;"

    cursor.execute(sql)

            cursor.close()
    conn.close()

El tiempo que se tarda en ejecutar la petición HTTP dispara hasta 4 - 5 segundos! Creo que esto se incurre en el tiempo que se necesita para conectarse a la propia base de datos MySQL.

Mi pregunta es cómo puedo acelerar esto verdad? ¿Puedo declarar la conexión MySQL en el ámbito global y acceder a él en los controladores de solicitudes mediante la creación de un nuevo cursor, o la voluntad que tenga problemas de concurrencia debido al diseño asíncrono de Tornado?

Básicamente, ¿cómo puedo no tener que incurrir en una nueva conexión a un servidor MySQL CADA petición HTTP, por lo que sólo se necesita una fracción de segundo en lugar de varios segundos para poner en práctica.

Además, tenga en cuenta que el servidor SQL es en realidad en la misma máquina física que la instancia del tornado servidor Web

Actualizar

Me acabo de encontrar un simple consulta MySQL a través de un generador de perfiles, el mismo código de abajo.

La llamada a 'connections.py' función init tomó 4.944 segundos para ejecutar solos. Eso no me parece bien, ¿verdad?

Actualizar 2

Creo que se ejecuta con una conexión (o incluso unos pocos con una piscina muy simple conn DB) será lo suficientemente rápido para manejar el caudal Estoy esperando por instancia de servidor web tornado.

Si 1.000 clientes necesitan acceder a una consulta, los tiempos de consulta típicas están en los miles de segundos, el cliente más desafortunado sólo habría que esperar un segundo para recuperar los datos.

¿Fue útil?

Solución

SQLAlchemy , que proporciona una abstracción más agradable sobre DBAPI y también proporciona la agrupación de conexiones, etc. (Usted puede ignorar alegremente su ORM y sólo tiene que utilizar el SQL-toolkit)

(También, usted no está haciendo el bloqueo de las llamadas bases de datos en los controladores de solicitudes asíncronas?)

Otros consejos

Una conexión de SQL no debe tomar 5 segundos. Trate de no emitir una consulta y ver si mejora el rendimiento -. La cual debe

El módulo MySQLdb tiene una threadsafety de "1", que significa que el módulo es hilo de seguridad, pero las conexiones no puede ser compartido entre hilos. Se puede implementar un conjunto de conexiones como una alternativa.

Por último, el DB-API tiene una forma reemplazo de parámetros para las consultas que no requieran manualmente la concatenación de una consulta y escapar parámetros:

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))

Pronúnciate en el controlador de base, que se llamará una vez por aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top