bzgl der Zugriffe auf auf eine Datenbank über psycopg2.
Laut Python Database API Specification: PEP249 gilt für
Datenbankmodule wie psycopg2 mit thread-safety level 2:
Das hab ich dann auch so innerhalb eines größeren Projects so umgestzt und habThreads may share the module and connections.
dann bei starken Belastungstests festgestellt, dass sich die cursor bei den Datenbankzugriffen in die Quere kommen können.
Bekomme unterschiedliche OperationalErrors die zu erkennen geben das die übermittelten SQL-Statements über den Jordan sind.
Diese Mailinglist von Gregorio und mein kleines Testprogramm bestätigen das Problem.
Code: Alles auswählen
import threading
import psycopg2
THREADS = 20
conn_string = "host=... port=... "
dbConnection = psycopg2.connect(conn_string)
def test():
cursor = dbConnection.cursor()
cursor.execute("select name from components where id = %i" % 1)
sql_result = cursor.fetchall ()
for i in range(THREADS):
t=threading.Thread(target=test)
t.start()
wenn da steht, dass sich die Threads die Connection teilen dürfen
und ich jedem Thread ein eigenes Cursor-objekt in die Hand drücke,
müsste das doch eigentlich gehen.
Weiß einer den genauen Hintergrund? Und/Oder was ich falsch verstanden habe? Ist psycopg vielleicht doch nicht Level 2 safety?
Ich möchte halt gerne wissen wie es zu solchen crashes kommen kann wenn
ich doch angeblich die connection sharen darf.
Lösungswege wie Locks() oder ThreadedConnectionPool sind mir bekannt.
Vielen Dank im voraus