Question

J'ai récemment exploré le cadre web Tornado pour servir beaucoup de connexions cohérentes par beaucoup de différents clients.

J'ai un gestionnaire de requêtes qui prend essentiellement une chaîne cryptée RSA et déchiffre. Le texte déchiffré est une chaîne XML qui obtient analysé par un gestionnaire de documents SAX que je l'ai écrit. Tout fonctionne parfaitement bien et le temps d'exécution (par requête HTTP) était d'environ 100 millisecondes (avec le décryptage et l'analyse syntaxique).

Le fichier XML contient le hachage Nom d'utilisateur et mot de passe de l'utilisateur. Je veux me connecter à un serveur MySQL pour vérifier que le nom d'utilisateur correspond au hachage de mot de passe fourni par l'application.

Quand j'ajoute essentiellement le code suivant:

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()

Le temps qu'il faut pour exécuter la requête HTTP tire jusqu'à 4 - 5 secondes! Je crois que cela est engagé dans le temps qu'il faut pour se connecter au serveur de base de données MySql lui-même.

Ma question est de savoir comment puis-je accélérer cela? Puis-je déclarer la connexion MySQL dans la portée globale et l'accès dans les gestionnaires de requêtes en créant un nouveau curseur, ou la volonté qui se jettent dans les problèmes de concurrence en raison de la conception asynchrone de Tornado?

En gros, comment puis-je ne pas avoir à subir une nouvelle connexion à un serveur MySQL CHAQUE Http demande, il ne prend qu'une fraction de seconde au lieu de plusieurs secondes pour mettre en œuvre.

En outre, s'il vous plaît noter que le serveur SQL est en fait sur la même machine physique que l'instance Tornado Web Server

Mise à jour

Je viens de rencontrer une simple requête MySQL via un profileur, le même code ci-dessous.

L'appel à 'connections.py' init fonction a pris 4.944 secondes pour exécuter seul. Cela ne semble pas juste, non?

Mise à jour 2

Je pense que la course avec une connexion (ou même quelques-unes avec une piscine DB conn très simple) sera assez rapide pour gérer le débit que je me attends par une tornade instance de serveur Web.

Si 1000 clients ont besoin d'accéder à une requête, les temps typiques de la requête étant dans les milliers de secondes, le client ne serait plus malchanceuse attendre une seconde pour récupérer les données.

Était-ce utile?

La solution

SQLAlchemy , qui offre une plus belle abstraction sur DBAPI et fournit également la mise en commun de connexion, etc. (Vous peut heureusement ignorer son ORM et il suffit d'utiliser la boîte à outils SQL)

(En outre, vous ne faites pas les appels de base de données de blocage dans les gestionnaires de requêtes asynchrones?)

Autres conseils

Une connexion SQL ne doit pas prendre 5 secondes. Essayez de ne pas émettre une requête et voir si cela améliore votre performance -. Laquelle il devrait

Le module mysqldb a une threadsafety de "1", ce qui signifie que le module est thread-safe, mais les connexions ne peuvent pas être partagées entre les threads. Vous pouvez mettre en place un pool de connexion comme une alternative.

Enfin, l'API DB-a une forme de remplacement des paramètres pour les requêtes qui ne nécessiteraient pas concaténer manuellement une requête et d'échapper à des paramètres:

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

Déclarez dans le gestionnaire de base, il sera appelé une fois par application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top