2010-08-11 9 views
6

Dopo aver combattuto con diverse cose qua e là, sono stato finalmente in grado di ottenere BottlePY in esecuzione su Apache ed eseguire un sito basato su MongoDB. Sono abituato a usare le app di Django, quindi mi riferirò un po 'alla mia domanda.Perché la mia connessione MongoDB remota richiede l'autenticazione su ogni query?

Il problema

Ogni volta che una pagina viene caricata tramite BottlePY, la connessione al database MongoDB situato MongoHQ.com ha bisogno di essere ri-autenticazione (il che significa che probabilmente doveva riconnettersi).

cosa ho trovato

ho attaccato una funzione db.keep_alive() all'inizio di ogni funzione modello, in modo che prima di qualsiasi richiesta mongodb viene eseguito, provi ad eseguire una query semplice. Se non riesce, intercetta gli errori OperationFailure o AutoReconnect e quindi chiama la funzione db.authenticate(). Dopo la riautenticazione, ho aggiunto un log a un log db per monitorare la frequenza con cui è necessario riautenticarlo. Attualmente, è necessario eseguire nuovamente l'autenticazione su ogni caricamento della pagina (che richiede l'esecuzione di una query). Questo non è giusto.

differenza di Django

uso questo stesso concetto in Django, e hanno trovato che la connessione db deve solo essere autenticato dopo 10-15 minuti di nessuna query in esecuzione.

Non capisco perché la creazione di una connessione pymongo in django sia diversa dalla creazione di una bottiglia, poiché utilizzo lo stesso driver, funzioni e metodi. Neanche io sto usando alcun ORMS o qualcosa del genere.

Versioni

  • Bottiglia: 0.9.dev
  • Django: 1.2.1 finale
  • PyMongo: 1,8

Apprezzo l'aiuto!

Aggiornamento: un amico è stato in grado di dare una rapida occhiata e ha notato quanto segue che può aiutare a rispondere alla mia domanda.

Sembra che ogni richiesta è il lancio di un nuovo processo di Python, come contrario di Django, in cui un singolo processo mantenendo in funzione per un lungo periodo di tempo .

+0

È necessario autenticarsi tutte le volte che il numero dei processi di lavoro. Non è possibile riutilizzare le connessioni database tra processi. Quindi il primo pensa che devi risolvere nel tuo framework (indipendentemente da MongoDB), che ci sono solo pochi processi (in un pool di worker) nel tuo framework che servono le tue richieste. os.getpid() dovrebbe restituire solo alcuni valori disgiunti. – pts

+0

come esegui il tuo python all'interno di apache: tramite mod_python o wsgi? –

+0

@pts Grazie! Sto esaminando questo. @ ralf.w. WSGI su Apache2 –

risposta

1

Questo solo ha finito per essere una cosa strana tra la Bottiglia e MongoHQ.Non è stata trovata alcuna soluzione reale, ma non è stato possibile ricrearla con altri framework. Qualsiasi altra idea è apprezzata.

0

fa Apache xxx.conf contiene qualcosa di simile:

WSGIDaemonProcess project user=mysite group=www-data processes=5 threads=1 WSGIProcessGroup project

penso più importante dovrebbe essere threads=1

+0

Era impostato su 10 ma l'ho modificato su 1 e non ha risolto il problema. Buon punto, grazie! –

+0

Prova anche a impostare sia processes = 1 che threads = 1 e verifica se il problema scompare. Si noti che questa dovrebbe essere solo un'impostazione temporanea per il debug, poiché limita il numero di connessioni simultanee che l'applicazione Web può gestire. – pts

+0

Entrambe le variabili erano già impostate su 1. –