Python SQL数据库查询的多线程处理

Python SQL数据库查询的多线程处理,python,sql,database,multithreading,postgresql,Python,Sql,Database,Multithreading,Postgresql,例如,假设我有一个messenger数据库。我的应用程序正在收集消息并将其存储在我的数据库中。不管它是什么类型的数据库,我想知道它通常是如何实现的,我的数据库是否支持它,如果它不支持,是否还有其他数据库支持它,但在我的例子中是PostgreSQL。我还使用PythonPsychoPG2适配器。我真正想要的是管理所有的查询,这样它们就不会相互干扰 让我们弄清楚我想要什么。假设我们有两个线程,两个客户端,它们运行在不同的线程中,并且正在从数据库加载消息。客户端1正在运行: SELECT * FROM

例如,假设我有一个messenger数据库。我的应用程序正在收集消息并将其存储在我的数据库中。不管它是什么类型的数据库,我想知道它通常是如何实现的,我的数据库是否支持它,如果它不支持,是否还有其他数据库支持它,但在我的例子中是PostgreSQL。我还使用PythonPsychoPG2适配器。我真正想要的是管理所有的查询,这样它们就不会相互干扰

让我们弄清楚我想要什么。假设我们有两个线程,两个客户端,它们运行在不同的线程中,并且正在从数据库加载消息。客户端1正在运行:

SELECT * FROM messages WHERE user_id = client1_id;
从数据库中选择他编写的所有消息,然后尝试获取数据,但是,我想,它变成的是来自Client2的所有消息。现在的情况是:

# in thread 1:
   
  cursor.execute('SELECT * FROM messages WHERE user_id = %s;', client1_id)

# in thread 2
   
  cursor.execute('SELECT * FROM messages WHERE user_id = %s;', client2_id)   << this is the last SELECT

# then again in thread 1

  cursor.fetchall()                                                          << fetching data from the last select

# and then in thread 2
  
  cursor.fetchall()
我认为将要发生的是,Client1将从最后一个select中检索数据,在本例中,它是Client2中的数据,这就是我试图找到答案的问题

问题:

如何在不同的线程中读取和写入数据库中的数据,以便每个客户机都能独立于其他客户机运行其查询


正如前面提到的,多个连接对我来说不是一个好的解决方案,我认为当你有10000个用户时,缓冲所有查询并将它们作为一个序列一行执行是没有意义的。那么,在这种情况下,我应该使用什么样的体系结构呢?提前感谢。

对于现代数据库,每个查询将在其单独的空间中运行。这意味着这两个查询可能返回不同的结果集

维基百科页面是一本很好的读物

此外,请记住,当从数据库检索数据时,您只能获得数据的副本;你无法在应用程序中控制它。从数据库检索数据时,它可能已经过时,因为其他线程或应用程序可能已经对其进行了修改


另外,我建议在一个高度多线程的应用程序中,你应该考虑版本号模式来检测和控制许多用户更新相同的数据。否则,设计糟糕的应用程序可能会无意中破坏数据。

基本上,当您在任何位置打开连接时,关闭它然后创建新连接是一种好方法。在上面的代码中,您正在执行两个查询,并在第二个线程之后获取。现在,您将在第二个线程上获得的结果。正确的方法是,创建一个连接,获取结果并关闭操作完成时的连接,然后打开一个新连接,就像执行操作并关闭它一样。这种方法在任何编程语言中都很好地遵循。下面是示例代码

# in thread 1:

   cursor.execute('SELECT * FROM messages WHERE user_id = %s;', client1_id)

   cursor.fetchall()   
   con.close()   

# in thread 2

   cursor.execute('SELECT * FROM messages WHERE user_id = %s;', client2_id)   

   cursor.fetchall()
   con.close()

好问题+哇,那正是我想要的,谢谢。但这是每次打开和关闭连接的好方法吗?是否需要更多的时间来进行?考虑我通过本地主机连接到数据库,我的数据库连接到同一个网络。是的,它是每次打开和关闭的好方法。因为,当您不关闭连接并打开一个新连接时,多个连接将被打开,数据库将被锁定,因为在您使用localhost时,它无法并行接受连接。这是打开和关闭的最佳方法。如果你觉得这个答案是可靠的,请把它标记为正确的答案,这样其他人也可能会有所帮助。我之所以烦恼的主要原因是——打开和关闭连接需要很多时间吗?不,这不会需要很多时间。打开多个连接所需的时间相同。