Datenbankzugriff in Threads

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
rhu
User
Beiträge: 3
Registriert: Donnerstag 26. April 2018, 23:17

Moin, moin...

Ich möchte in parallel ablaufenden Threads einen Zugriff auf eine Postgres DB realisieren.
Man kann ja in jedem Thread eine neue Connection aufbauen oder aber eine bestehende Connection nutzen und in dem jeweiligen Thread einen neuen Cursor zu erzeugen.
Jetzt stellt sich mir die Frage, welcher Methode ich den Vorzug geben soll. :?:

DB Version: "PostgreSQL 9.5.13 on x86_64-pc-linux-gnu (Ubuntu 9.5.13-2.pgdg16.04+1), compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609, 64-bit"
genutztes Python Modul: psycopg2 2.7.4
Zugriff: lesen & schreiben

Welcher Variante würdet Ihr den Vorzug geben?
Was muss ich jeweils beachten?

Vielen Dank schon einmal im Voraus für Eure Meinungen!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Methode ganz ohne Threads ist die beste. Warum willst du parallel abfragen? Python parallelisiert mit Threads eh schlecht, und das die DB Daten parallel schneller ausliefert ist zwar nicht unmöglich, aber auch nicht garantiert.
rhu
User
Beiträge: 3
Registriert: Donnerstag 26. April 2018, 23:17

Nicht der DB Zugriff soll durch die Threads beschleunigt werden.
Im konkreten Fall lade ich mehrere Webseiten herunter , werte diese aus und das Ergebnis soll jetzt in eine DB geschrieben werden.
Die parallele Verarbeitung, speziell der Downloads, beschleunigt den gesamten Vorgang ungemein.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dann mach Dir pro Thread eine neue Connection auf. Im Vergleich zum Download kostet das wenig bis nichts.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Als erstes müsstest Du schauen was das `threadsafety`-Attribut vom Modul erlaubt. Bei `psycopg2` müsste das 2 sein, also „Threads may share the module and connections.“ — `Cursor` müssen also im jeweiligen Thread erstellt werden.

Ich würde eine Verbindung pro Thread erstellen. Denn wenn auch geschrieben werden soll, wird das mit den Transaktionen sonst interessant. Also solange das nicht ”natürlich” funktioniert. Also das die Threads beispielsweise alle am selben Problem arbeiten und ein Thread dann dafür zuständig ist die Transaktion für alle abzuschliessen.

An der Stelle mache ich dann auch immer noch Werbung für SQLAlchemy. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
rhu
User
Beiträge: 3
Registriert: Donnerstag 26. April 2018, 23:17

THX, für die Antworten!
Ich mache jetzt pro Thread eine neue Verbindung auf, der Kommentar von __blackjack__ lässt ja erahnen, das es sonst zu Problemen kommen kann.
Antworten