@@ -23,38 +23,34 @@ <h1 class="title">Benutzeranleitung für DBUtils</h1>
2323< li > < p > < a class ="reference internal " href ="#zusammenfassung " id ="toc-entry-1 "> Zusammenfassung</ a > </ p > </ li >
2424< li > < p > < a class ="reference internal " href ="#module " id ="toc-entry-2 "> Module</ a > </ p > </ li >
2525< li > < p > < a class ="reference internal " href ="#download " id ="toc-entry-3 "> Download</ a > </ p > </ li >
26- < li > < p > < a class ="reference internal " href ="#installation " id ="toc-entry-4 "> Installation</ a > </ p >
26+ < li > < p > < a class ="reference internal " href ="#installation " id ="toc-entry-4 "> Installation</ a > </ p > </ li >
27+ < li > < p > < a class ="reference internal " href ="#anforderungen " id ="toc-entry-5 "> Anforderungen</ a > </ p > </ li >
28+ < li > < p > < a class ="reference internal " href ="#funktionalitat " id ="toc-entry-6 "> Funktionalität</ a > </ p >
2729< ul >
28- < li > < p > < a class ="reference internal " href ="#installation-1 " id ="toc-entry-5 "> Installation</ a > </ p > </ li >
30+ < li > < p > < a class ="reference internal " href ="#simplepooleddb-simple-pooled-db " id ="toc-entry-7 "> SimplePooledDB (simple_pooled_db)</ a > </ p > </ li >
31+ < li > < p > < a class ="reference internal " href ="#steadydbconnection-steady-db " id ="toc-entry-8 "> SteadyDBConnection (steady_db)</ a > </ p > </ li >
32+ < li > < p > < a class ="reference internal " href ="#persistentdb-persistent-db " id ="toc-entry-9 "> PersistentDB (persistent_db)</ a > </ p > </ li >
33+ < li > < p > < a class ="reference internal " href ="#pooleddb-pooled-db " id ="toc-entry-10 "> PooledDB (pooled_db)</ a > </ p > </ li >
34+ < li > < p > < a class ="reference internal " href ="#die-qual-der-wahl " id ="toc-entry-11 "> Die Qual der Wahl</ a > </ p > </ li >
2935</ ul >
3036</ li >
31- < li > < p > < a class ="reference internal " href ="#anforderungen " id ="toc-entry-6 "> Anforderungen</ a > </ p > </ li >
32- < li > < p > < a class ="reference internal " href ="#funktionalitat " id ="toc-entry-7 "> Funktionalität</ a > </ p >
37+ < li > < p > < a class ="reference internal " href ="#benutzung " id ="toc-entry-12 "> Benutzung</ a > </ p >
3338< ul >
34- < li > < p > < a class ="reference internal " href ="#simplepooleddb-simple-pooled-db " id ="toc-entry-8 "> SimplePooledDB (simple_pooled_db)</ a > </ p > </ li >
35- < li > < p > < a class ="reference internal " href ="#steadydbconnection-steady-db " id ="toc-entry-9 "> SteadyDBConnection (steady_db)</ a > </ p > </ li >
36- < li > < p > < a class ="reference internal " href ="#persistentdb-persistent-db " id ="toc-entry-10 "> PersistentDB (persistent_db)</ a > </ p > </ li >
37- < li > < p > < a class ="reference internal " href ="#pooleddb-pooled-db " id ="toc-entry-11 "> PooledDB (pooled_db)</ a > </ p > </ li >
38- < li > < p > < a class ="reference internal " href ="#die-qual-der-wahl " id ="toc-entry-12 "> Die Qual der Wahl</ a > </ p > </ li >
39+ < li > < p > < a class ="reference internal " href ="#persistentdb-persistent-db-1 " id ="toc-entry-13 "> PersistentDB (persistent_db)</ a > </ p > </ li >
40+ < li > < p > < a class ="reference internal " href ="#pooleddb-pooled-db-1 " id ="toc-entry-14 "> PooledDB (pooled_db)</ a > </ p > </ li >
3941</ ul >
4042</ li >
41- < li > < p > < a class ="reference internal " href ="#benutzung " id ="toc-entry-13 " > Benutzung</ a > </ p >
43+ < li > < p > < a class ="reference internal " href ="#besonderheiten-bei-der- benutzung " id ="toc-entry-15 " > Besonderheiten bei der Benutzung</ a > </ p >
4244< ul >
43- < li > < p > < a class ="reference internal " href ="#persistentdb-persistent-db-1 " id ="toc-entry-14 "> PersistentDB (persistent_db)</ a > </ p > </ li >
44- < li > < p > < a class ="reference internal " href ="#pooleddb-pooled-db-1 " id ="toc-entry-15 "> PooledDB (pooled_db)</ a > </ p > </ li >
45+ < li > < p > < a class ="reference internal " href ="#steuerung-der-ausfallsicherung " id ="toc-entry-16 "> Steuerung der Ausfallsicherung</ a > </ p > </ li >
4546</ ul >
4647</ li >
47- < li > < p > < a class ="reference internal " href ="#besonderheiten-bei-der-benutzung " id ="toc-entry-16 "> Besonderheiten bei der Benutzung</ a > </ p >
48- < ul >
49- < li > < p > < a class ="reference internal " href ="#steuerung-der-ausfallsicherung " id ="toc-entry-17 "> Steuerung der Ausfallsicherung</ a > </ p > </ li >
50- </ ul >
51- </ li >
52- < li > < p > < a class ="reference internal " href ="#anmerkungen " id ="toc-entry-18 "> Anmerkungen</ a > </ p > </ li >
53- < li > < p > < a class ="reference internal " href ="#zukunft " id ="toc-entry-19 "> Zukunft</ a > </ p > </ li >
54- < li > < p > < a class ="reference internal " href ="#fehlermeldungen-und-feedback " id ="toc-entry-20 "> Fehlermeldungen und Feedback</ a > </ p > </ li >
55- < li > < p > < a class ="reference internal " href ="#links " id ="toc-entry-21 "> Links</ a > </ p > </ li >
56- < li > < p > < a class ="reference internal " href ="#autoren " id ="toc-entry-22 "> Autoren</ a > </ p > </ li >
57- < li > < p > < a class ="reference internal " href ="#copyright-und-lizenz " id ="toc-entry-23 "> Copyright und Lizenz</ a > </ p > </ li >
48+ < li > < p > < a class ="reference internal " href ="#anmerkungen " id ="toc-entry-17 "> Anmerkungen</ a > </ p > </ li >
49+ < li > < p > < a class ="reference internal " href ="#zukunft " id ="toc-entry-18 "> Zukunft</ a > </ p > </ li >
50+ < li > < p > < a class ="reference internal " href ="#fehlermeldungen-und-feedback " id ="toc-entry-19 "> Fehlermeldungen und Feedback</ a > </ p > </ li >
51+ < li > < p > < a class ="reference internal " href ="#links " id ="toc-entry-20 "> Links</ a > </ p > </ li >
52+ < li > < p > < a class ="reference internal " href ="#autoren " id ="toc-entry-21 "> Autoren</ a > </ p > </ li >
53+ < li > < p > < a class ="reference internal " href ="#copyright-und-lizenz " id ="toc-entry-22 "> Copyright und Lizenz</ a > </ p > </ li >
5854</ ul >
5955</ nav >
6056< section id ="zusammenfassung ">
@@ -118,7 +114,7 @@ <h2>Module</h2>
118114< img alt ="dependencies_db.png " src ="dependencies_db.png " />
119115< p > Die Abhängigkeiten der Module in der Variante für den klassischen
120116PyGreSQL-Adapter sehen ähnlich aus:</ p >
121- < img alt ="depdependencies_pg .png " src ="depdependencies_pg .png " />
117+ < img alt ="dependencies_pg .png " src ="dependencies_pg .png " />
122118</ section >
123119< section id ="download ">
124120< h2 > Download</ h2 >
@@ -130,15 +126,12 @@ <h2>Download</h2>
130126</ section >
131127< section id ="installation ">
132128< h2 > Installation</ h2 >
133- < section id ="installation-1 ">
134- < h3 > Installation</ h3 >
135129< p > Das Paket kann auf die übliche Weise installiert werden:</ p >
136130< pre class ="literal-block "> python setup.py install</ pre >
137131< p > Noch einfacher ist, das Paket in einem Schritt mit < a class ="reference external " href ="https://pip.pypa.io/ "> pip</ a > automatisch
138132herunterzuladen und zu installieren:</ p >
139133< pre class ="literal-block "> pip install DBUtils</ pre >
140134</ section >
141- </ section >
142135< section id ="anforderungen ">
143136< h2 > Anforderungen</ h2 >
144137< p > DBUtils unterstützt die < a class ="reference external " href ="https://www.python.org "> Python</ a > Versionen 3.7 bis 3.14.</ p >
@@ -152,7 +145,7 @@ <h2>Funktionalität</h2>
152145< p > Dieser Abschnitt verwendet nur die Bezeichnungen der DB-API-2-Variante, aber
153146Entsprechendes gilt auch für die PyGreSQL-Variante.</ p >
154147< p > DBUtils installiert sich als Paket < span class ="docutils literal "> dbutils</ span > , das alle hier beschriebenen
155- Module enthält. Jedes dieser Modul enthält im Wesentlichen eine Klasse, die
148+ Module enthält. Jedes dieser Module enthält im Wesentlichen eine Klasse, die
156149einen analogen Namen trägt und die jeweilige Funktionalität bereitstellt.
157150So enthält z.B. das Modul < span class ="docutils literal "> dbutils.pooled_db</ span > die Klasse < span class ="docutils literal "> PooledDB</ span > .</ p >
158151< section id ="simplepooleddb-simple-pooled-db ">
@@ -170,12 +163,12 @@ <h3>SimplePooledDB (simple_pooled_db)</h3>
170163< section id ="steadydbconnection-steady-db ">
171164< h3 > SteadyDBConnection (steady_db)</ h3 >
172165< p > Die Klasse < span class ="docutils literal "> SteadyDBConnection</ span > im Modul < span class ="docutils literal "> dbutils.steady_db</ span > stellt
173- "gehärtete" Datenbankverbindungen bereit, denen gewöhnlichen Verbindungen
166+ "gehärtete" Datenbankverbindungen bereit, denen gewöhnliche Verbindungen
174167eines DB-API-2-Datenbankadapters zugrunde liegen. Eine "gehärtete" Verbindung
175168wird bei Zugriff automatisch, ohne dass die Anwendung dies bemerkt, wieder
176169geöffnet, wenn sie geschlossen wurde, die Datenbankverbindung unterbrochen
177170wurde, oder wenn sie öfter als ein optionales Limit genutzt wurde.</ p >
178- < p > Ein typisches Beispiel wo dies benötig wird, ist, wenn die Datenbank neu
171+ < p > Ein typisches Beispiel, wo dies benötigt wird, ist, wenn die Datenbank neu
179172gestartet wurde, während Ihre Anwendung immer noch läuft und Verbindungen
180173zur Datenbank offen hat, oder wenn Ihre Anwendung auf eine entfernte Datenbank
181174über ein Netzwerk zugreift, das durch eine Firewall geschützt ist, und die
@@ -186,7 +179,7 @@ <h3>SteadyDBConnection (steady_db)</h3>
186179< section id ="persistentdb-persistent-db ">
187180< h3 > PersistentDB (persistent_db)</ h3 >
188181< p > Die Klasse < span class ="docutils literal "> PersistentDB</ span > im Modul < span class ="docutils literal "> dbutils.persistent_db</ span > stellt
189- gehärtete, thread-affine, persistente Datenbankverbindungen zur Verfügung,
182+ gehärtete, thread-affine, persistente Datenbankverbindungen zur Verfügung,
190183unter Benutzung eines beliebigen DB-API-2-Datenbankadapters. Mit "thread-affin"
191184und "persistent" ist hierbei gemeint, dass die einzelnen Datenbankverbindungen
192185den jeweiligen Threads fest zugeordnet bleiben und während der Laufzeit des
@@ -223,7 +216,7 @@ <h3>PooledDB (pooled_db)</h3>
223216den verschiedenen Threads beliebig zuteilen. Dies geschieht standardmäßig, wenn
224217Sie den Verbindungspool mit einem positiven Wert für < span class ="docutils literal "> maxshared</ span > einrichten
225218und der zugrunde liegende DB-API-2-Datenbankadapter auf der Verbindungsebene
226- thread-sicher ist, aber sie können auch dedizierte Datenbankverbindungen
219+ thread-sicher ist, aber Sie können auch dedizierte Datenbankverbindungen
227220anfordern, die nicht von anderen Threads verwendet werden sollen. Neben dem
228221Pool gemeinsam genutzter Datenbankverbindungen ("shared pool") können Sie auch
229222einen Pool von mindestens < span class ="docutils literal "> mincached</ span > und höchstens < span class ="docutils literal "> maxcached</ span > inaktiven
@@ -275,7 +268,7 @@ <h2>Benutzung</h2>
275268< h3 > PersistentDB (persistent_db)</ h3 >
276269< p > Wenn Sie das < span class ="docutils literal "> persistent_db</ span > -Modul einsetzen möchten, müssen Sie zuerst einen
277270Generator für die von Ihnen gewünschte Art von Datenbankverbindungen einrichten,
278- indem Sie eine Instanz der Klasse < span class ="docutils literal "> persistent_db </ span > erzeugen, wobei Sie folgende
271+ indem Sie eine Instanz der Klasse < span class ="docutils literal "> PersistentDB </ span > erzeugen, wobei Sie folgende
279272Parameter angeben müssen:</ p >
280273< ul >
281274< li > < p > < span class ="docutils literal "> creator</ span > : entweder eine Funktion, die neue DB-API-2-Verbindungen
@@ -334,7 +327,7 @@ <h3>PersistentDB (persistent_db)</h3>
334327< p > Bitte beachten Sie, dass Transaktionen explizit durch Aufruf der Methode
335328< span class ="docutils literal "> begin()</ span > eingeleitet werden müssen. Hierdurch wird sichergestellt, dass
336329das transparente Neueröffnen von Verbindungen bis zum Ende der Transaktion
337- ausgesetzt wird, und dass die Verbindung zurückgerollt wird, before sie vom
330+ ausgesetzt wird, und dass die Verbindung zurückgerollt wird, bevor sie vom
338331gleichen Thread erneut benutzt wird.</ p >
339332</ aside >
340333< p > Das Holen einer Verbindung kann etwas beschleunigt werden, indem man den
@@ -347,22 +340,22 @@ <h3>PersistentDB (persistent_db)</h3>
347340< h3 > PooledDB (pooled_db)</ h3 >
348341< p > Wenn Sie das < span class ="docutils literal "> pooled_db</ span > -Modul einsetzen möchten, müssen Sie zuerst einen
349342Pool für die von Ihnen gewünschte Art von Datenbankverbindungen einrichten,
350- indem Sie eine Instanz der Klasse < span class ="docutils literal "> pooled_db </ span > erzeugen, wobei Sie folgende
343+ indem Sie eine Instanz der Klasse < span class ="docutils literal "> PooledDB </ span > erzeugen, wobei Sie folgende
351344Parameter angeben müssen:</ p >
352345< ul >
353346< li > < p > < span class ="docutils literal "> creator</ span > : entweder eine Funktion, die neue DB-API-2-Verbindungen
354347erzeugt, oder ein DB-API-2-Datenbankadapter-Modul</ p > </ li >
355- < li > < p > < span class ="docutils literal "> mincached</ span > : die anfängliche Anzahl inaktiver Verbindungen, die auf
348+ < li > < p > < span class ="docutils literal "> mincached</ span > : die anfängliche Anzahl inaktiver Verbindungen, die auf
356349Vorrat gehalten werden sollen (der Standardwert < span class ="docutils literal "> 0</ span > bedeutet, dass beim
357350Start keine Verbindungen geöffnet werden)</ p > </ li >
358351< li > < p > < span class ="docutils literal "> maxcached</ span > : Obergrenze für die Anzahl inaktiver Verbindungen, die auf
359352Vorrat gehalten werden sollen (der Standardwert < span class ="docutils literal "> 0</ span > oder < span class ="docutils literal "> None</ span > bedeutet
360353unbegrenzte Größe des Vorratsspeichers)</ p > </ li >
361- < li > < p > < span class ="docutils literal "> maxshared</ span > : Obergrenze für die Anzahl gemeinsam genutzer Verbindungen
354+ < li > < p > < span class ="docutils literal "> maxshared</ span > : Obergrenze für die Anzahl gemeinsam genutzter Verbindungen
362355(der Standardwert < span class ="docutils literal "> 0</ span > oder < span class ="docutils literal "> None</ span > bedeutet, dass alle Verbindungen
363356dediziert sind)</ p >
364- < p > Wenn diese Obergrenze erreicht wird, werden Verbindungen wiederverwendet ,
365- wenn diese als wiederverwendbar angefordert werden.</ p >
357+ < p > Wenn diese Obergrenze erreicht wird, werden Verbindungen gemeinsam genutzt ,
358+ sofern diese als gemeinsam nutzbar angefordert werden.</ p >
366359</ li >
367360< li > < p > < span class ="docutils literal "> maxconnections</ span > : Obergrenze für die Anzahl an Datenbankverbindungen,
368361die insgesamt überhaupt erlaubt werden sollen (der Standardwert < span class ="docutils literal "> 0</ span >
@@ -426,18 +419,21 @@ <h3>PooledDB (pooled_db)</h3>
426419< p > Wenn Sie die Datenbankverbindung nicht mehr benötigen, sollten Sie diese sofort
427420wieder mit < span class ="docutils literal "> db.close()</ span > an den Pool zurückgeben. Sie können auf die gleiche
428421Weise eine neue Verbindung erhalten.</ p >
429- < p > < em > Warnung:</ em > In einer Multithread-Umgebung benutzen Sie niemals:</ p >
422+ < aside class ="admonition warning ">
423+ < p class ="admonition-title "> Warnung</ p >
424+ < p > In einer Multithread-Umgebung benutzen Sie niemals:</ p >
430425< pre class ="literal-block "> pool.connection().cursor().execute(...)</ pre >
431- < p > Dies würde die Datenbankverbindung zu früh zur Wiederverwendung zurückgeben,
432- was fatale Folgen haben könnte, wenn die Verbindungen nicht thread-sicher sind.
433- Stellen Sie sicher, dass die Verbindungsobjekte so lange vorhanden sind, wie
434- sie gebraucht werden, etwa so:</ p >
426+ < p > Dies würde die Datenbankverbindung zu früh zur Wiederverwendung
427+ zurückgeben, was fatale Folgen haben könnte, wenn die Verbindungen nicht
428+ thread-sicher sind. Stellen Sie sicher, dass die Verbindungsobjekte so
429+ lange vorhanden sind, wie sie gebraucht werden, etwa so:</ p >
435430< pre class ="literal-block "> db = pool.connection()
436431cur = db.cursor()
437432cur.execute(...)
438433res = cur.fetchone()
439434cur.close() # oder del cur
440435db.close() # oder del db</ pre >
436+ </ aside >
441437< p > Sie können dies auch durch Verwendung von Kontext-Managern vereinfachen:</ p >
442438< pre class ="literal-block "> with pool.connection() as db:
443439 with db.cursor() as cur:
@@ -456,19 +452,19 @@ <h3>PooledDB (pooled_db)</h3>
456452</ section >
457453< section id ="besonderheiten-bei-der-benutzung ">
458454< h2 > Besonderheiten bei der Benutzung</ h2 >
459- < p > Manchmal möchte man Datenbankverbindung besonders vorbereiten, bevor sie
455+ < p > Manchmal möchte man Datenbankverbindungen besonders vorbereiten, bevor sie
460456von DBUtils verwendet werden, und dies ist nicht immer durch Verwendung
461- der passenden Parameter möglich. Zum Beispiel kann es < span class ="docutils literal "> pyodb </ span > erfordern,
457+ der passenden Parameter möglich. Zum Beispiel kann es < span class ="docutils literal "> pyodbc </ span > erfordern,
462458dass man die Methode < span class ="docutils literal "> setencoding()</ span > der Datenbankverbindung aufruft.
463459Sie können dies erreichen, indem Sie eine modifizierte Version der
464460Funktion < span class ="docutils literal "> connect()</ span > verwenden und diese als < span class ="docutils literal "> creator</ span > (dem ersten
465461Argument) an < span class ="docutils literal "> PersistentDB</ span > oder < span class ="docutils literal "> PooledDB</ span > übergeben, etwa so:</ p >
466- < pre class ="literal-block "> from pyodbc import connect
462+ < pre class ="literal-block "> import pyodbc
467463from dbutils.pooled_db import PooledDB
468464
469465def creator():
470- con = connect(...)
471- con.setdecoding (...)
466+ con = pyodbc. connect(...)
467+ con.setencoding (...)
472468 return con
473469
474470creator.dbapi = pyodbc
@@ -549,9 +545,9 @@ <h2>Anmerkungen</h2>
549545im Kontext der Kindprozesse des Webservers läuft. Wenn Sie also das
550546< span class ="docutils literal "> pooled_db</ span > -Modul einsetzen, und mehrere dieser Kindprozesse laufen, dann
551547werden Sie ebenso viele Pools mit Datenbankverbindungen erhalten. Wenn diese
552- Prozesse viele Threads laufen lassen, dann mag dies eine sinnvoller Ansatz
548+ Prozesse viele Threads laufen lassen, dann mag dies ein sinnvoller Ansatz
553549sein, wenn aber diese Prozesse nicht mehr als einen Worker-Thread starten,
554- wie im Fall des Multi-Processing Moduls "prefork" für den Apache-Webserver,
550+ wie im Fall des Multi-Processing- Moduls "prefork" für den Apache-Webserver,
555551dann sollten Sie auf eine Middleware für das Connection-Pooling zurückgreifen,
556552die Multi-Processing unterstützt, wie zum Beispiel < a class ="reference external " href ="https://www.pgpool.net/ "> pgpool</ a > oder < a class ="reference external " href ="https://pgbouncer.github.io/ "> pgbouncer</ a >
557553für die PostgreSQL-Datenbank.</ p >
@@ -572,7 +568,7 @@ <h2>Zukunft</h2>
572568bemerken, weil erst dann die unterbrochenen Datenbankverbindungen entdeckt
573569würden und sich der Pool langsam wieder neu aufbaut. Mit dem Monitor-Thread
574570würde dies schon während der Nacht passieren, kurz nach der Unterbrechung.
575- Der Monitor-Thread könnte auch so konfiguriert werden, dass er überhaupt
571+ Der Monitor-Thread könnte auch so konfiguriert werden, dass er generell
576572täglich den Verbindungspool erneuert, kurz bevor die Benutzer erscheinen.</ p > </ li >
577573< li > < p > Optional sollten Benutzung, schlechte Verbindungen und Überschreitung von
578574Obergrenzen in Logs gespeichert werden können.</ p > </ li >
@@ -592,7 +588,7 @@ <h2>Links</h2>
592588< li > < p > < a class ="reference external " href ="https://webwareforpython.github.io/w4py/ "> Webware for Python</ a > Framework</ p > </ li >
593589< li > < p > Python < a class ="reference external " href ="https://www.python.org/dev/peps/pep-0249/ "> DB-API 2</ a > </ p > </ li >
594590< li > < p > < a class ="reference external " href ="https://www.postgresql.org/ "> PostgreSQL</ a > Datenbank</ p > </ li >
595- < li > < p > < a class ="reference external " href ="https://www.pygresql.org/ "> PyGreSQL</ a > Python-Adapter for PostgreSQL</ p > </ li >
591+ < li > < p > < a class ="reference external " href ="https://www.pygresql.org/ "> PyGreSQL</ a > Python-Adapter für PostgreSQL</ p > </ li >
596592< li > < p > < a class ="reference external " href ="https://www.pgpool.net/ "> pgpool</ a > Middleware für Connection-Pooling mit PostgreSQL</ p > </ li >
597593< li > < p > < a class ="reference external " href ="https://pgbouncer.github.io/ "> pgbouncer</ a > Middleware für Connection-Pooling mit PostgreSQL</ p > </ li >
598594< li > < p > < a class ="reference external " href ="http://sqlobject.org/ "> SQLObject</ a > Objekt-relationaler Mapper</ p > </ li >
0 commit comments