Après avoir lutté avec des choses différentes ici et là, j'ai finalement pu obtenir BottlePY sur Apache et lancer un site alimenté par MongoDB. Je suis habitué à exécuter des applications Django, donc je vais vous en parler un peu dans ma question.Pourquoi ma connexion MongoDB distante nécessite-t-elle une authentification sur chaque requête?
Le problème
Chaque fois qu'une page est chargée via BottlePY, la connexion à la base de données MongoDB situé sur MongoHQ.com doit être ré-authentifié (ce qui signifie qu'il a probablement de se reconnecter).
Ce que je trouve
J'attaché une fonction db.keep_alive()
en haut de chaque fonction de modèle, de sorte que avant toute requête MongoDB est exécuté, il essaye d'exécuter une requête simple. En cas d'échec, il saisit les erreurs OperationFailure ou AutoReconnect, puis appelle la fonction db.authenticate()
. Après qu'il réauthentifie, je l'ai ajouter un journal à un DB de journaux pour surveiller à quelle fréquence il doit réauthentifier. Actuellement, il doit se réauthentifier sur chaque chargement de page (ce qui nécessite l'exécution d'une requête). Ce n'est pas correct.
Différence de Django
J'utilise ce même concept dans django, et ont constaté que la connexion db ne doit être authentifié après 10-15 minutes de aucune requête en cours d'exécution. Je ne comprends pas pourquoi créer une connexion pymongo dans django serait différent de créer une connexion en bouteille, puisque j'utilise le même pilote, les mêmes fonctions et les mêmes méthodes. Je n'utilise pas d'ORMS ou quelque chose comme ça non plus.
Versions
- Bouteille: 0.9.dev
- Django: 1.2.1 finale
- PyMongo: 1,8
J'apprécie l'aide!
Mise à jour: Un ami a été capable de jeter un coup d'œil et a remarqué ce qui suit pour répondre à ma question.
Il semble que chaque demande est le lancement d'un nouveau processus de Python, comme opposé à Django, dans lequel un seul processus reste en cours d'exécution pendant une longue période de temps .
Vous devez vous authentifier autant de fois que le nombre de vos processus de travail. Vous ne pouvez pas réutiliser les connexions de base de données entre processus. Donc les premiers pensent que vous devez résoudre dans votre framework (indépendamment de MongoDB), qu'il n'y a qu'un petit nombre de processus (dans un pool de travailleurs) dans votre framework servant vos requêtes. os.getpid() devrait retourner seulement quelques valeurs disjointes. – pts
comment lancez-vous votre python à l'intérieur d'apache: via mod_python ou wsgi? –
@pts Merci! Je regarde dans ceci. @ ralf.w. WSGI sur Apache2 –