如何解决在线程中使用psycopg2游标的正确方法是什么?
我觉得我的问题的答案是在这两个SO问题中,但是我发现答案措辞很差(或高于我的薪水等级)
- multi thread python psycopg2
- Are transactions in PostgreSQL via
psycopg2
per-cursor or per-connection?
问题:使用psycopg2确保线程安全的正确方法是什么
选项1:每个线程都有自己的光标
import threading
import psycopg2
conn = psycopg2.connect (
host=127.0.0.1,user='john',password='1234',dbname='foo',port=1234)
class Foo (threading.Thread):
def __init__ (self):
threading.Thread.__init__(self)
def run (self):
global conn
cur = conn.cursor()
sql_query="SELECT * from foo;"
print(cur.execute (sql_query))
conn.commit()
num_threads = 100
threads = []
for i in seq (num_threads):
threads.append (Foo())
for i in seq (num_threads):
threads[i].start()
for i in seq (num_threads):
threads[i].join()
选项2:每个线程都有自己的连接
import threading
import psycopg2
db_conn = psycopg2.connect (
host=127.0.0.1,port=1234)
class Foo (threading.Thread):
def __init__ (self):
threading.Thread.__init__(self)
self.conn = psycopg2.connect (
host=127.0.0.1,port=1234)
def run (self):
cur = self.conn.cursor()
sql_query="SELECT * from foo;"
print(cur.execute (sql_query))
conn.commit()
num_threads = 100
threads = []
for i in seq (num_threads):
threads.append (Foo())
for i in seq (num_threads):
threads[i].start()
for i in seq (num_threads):
threads[i].join()
解决方法
每个线程应具有自己的数据库连接。
PostgreSQL连接只能在给定的时间处理一个语句(除非您使用的是server side cursor,但是即使那样,连接也只能同时处理一个FETCH
)。
因此,如果多个线程共享一个数据库连接,则它们必须仔细协调以确保只有一个线程同时使用该连接。例如,当另一个线程仍在等待查询结果时,您将无法发送新查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。