Jak se zachovat připojení k databázi ve webovém serveru python

hlasů
14

Dívám se na baňky tutorial, a navrhuje vytvořit nové připojení databáze pro každý webový požadavek. Je to správný způsob, jak dělat věci? Vždycky jsem si myslel, že připojení k databázi by měl pouze jednou vytvoří, jakmile pro každé vlákno. Může to být provedeno při zachování aplikace jako thread-safe, s baňky nebo jinými python webových serverů.

Položena 14/07/2011 v 05:13
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
12

K výukovým účelům možná ano. Ale v reálné aplikaci běžící na produkčním prostředí, které není ideální situace vůbec.

Za normálních okolností byste vždy chcete mít bazén spojení mezi vaší aplikací a databází. Bez ohledu na to, jaký jazyk / databáze se toto použití je společné řešení.

Připojení databáze bazénu udržuje otevřený celou řadu spojů. Aplikační vrstva prostě trvá spojení, které není používán, spojení se uvolňují, když je aplikační vrstva nepotřebuje už ne. Pod pojmem „povolený“ Myslím, že si se vrátil do bazénu, aby mohly být znovu použity.

Sečteno a podtrženo, spoje nejsou otevření / zavření na vyžádání. Dostanou získal / propuštěn z / na připojení k databázi bazénu.

Například Python a MySQL byste mohli jít na PySQLPool .

Odpovězeno 14/07/2011 v 05:45
zdroj uživatelem

hlasů
3

Tady je pěkný porovnání výkonu s různými řešeními. (PostgreSQL)

Krátká verze: vypadat na pgBouncer

Dlouhá verze: http://www.askthepony.com/blog/2011/07/django-and-postgresql-improving-the-performance-with-no-effort-and-no-code/

Odpovězeno 14/07/2011 v 12:35
zdroj uživatelem

hlasů
9

Je vytvoření nového připojení každý požadavek na způsob, jak jít? Ne. U velkých aplikací doporučujeme používat SQLAlchemy (což může mít bazén připojení nakonfigurován), a to i když nejste zájem o ORM. Tyto dokumenty mají oddíl, který skutečně: http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer

Odpovězeno 14/07/2011 v 13:56
zdroj uživatelem

hlasů
0

Podle mých zkušeností je to často dobrý nápad uzavřít spojení často. Zejména MySQL rád zavřít spojení, které byly delší dobu v nečinnosti, a někdy to může opustit trvalé připojení v zatuchlého stavu, který může dělat aplikace nereaguje.

To, co opravdu chcete udělat, je optimalizovat „mrtvý čas připojení“, zlomek času připojení je nahoru, ale není dělat žádnou práci. V případě vytvoření nového spojení s každým požadavkem, že mrtvá doba je opravdu jen nastavení a teardown čas. Kdyby jen navázání spojení jednou (na niti), a to nikdy zkazí, pak je mrtvá doba je doba nečinnosti.

Je-li vaše aplikace slouží jen málo žádostí, počet připojení, které se vyskytují bude také malý, a proto tam není moc výhoda udržování spojení otevřené, ale nečinná. Na jiném extrému, když aplikace je velmi zaneprázdněn, spoje jsou téměř nikdy nečinný, a zavírání spojení, které bude jen znovuotevření okamžitě je také zbytečný. Ve středu, když nové žádosti někdy následovat v žádostech o letu, ale někdy ne, budete muset udělat nějaké ladění výkonu na věci, jako je velikost bazénu, časový limit žádosti, a tak dále.

Velmi zaneprázdněn aplikace, která využívá bazén připojení k udržení spojení otevřeno bude jen někdy vidět jeden druh zpožděním; vyčkává na požadavek, že se už nikdy nevrátí, protože připojení gone bad. Jednoduchým řešením tohoto problému je provést známé, dobrou dotazu (což v MySQL je napsána SELECT 1) před poskytnutím připojení z fondu na žádost a recyklovat spojení, pokud nevrátí rychle.

Odpovězeno 14/07/2011 v 19:20
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more