Skip to main content
 首页 » 编程设计

python之使用 rpyc 一次连接到数据库并提供多个查询

2025年05月04日12insus

尝试将数据库查询结果提供给临时客户端请求,但不想为每个单独的查询打开连接。我不确定我做的是否正确。

当前的解决方案在“服务器”端是这样的(为清楚起见,已大幅缩减):

import rpyc 
from rpyc.utils.server import ThreadedServer 
import cx_Oracle 
 
conn = cx_Oracle.conect('whatever connect string') 
cursor = conn.cursor() 
 
def get_some_data(barcode): 
    # do something 
    return cursor.execute("whatever query",{'barcode':barcode}) 
 
class data_service(rpyc.Service): 
   def exposed_get_some_data(self, brcd):        
       return get_some_data(brcd) 
 
 
if __name__ == '__main__': 
   s = ThreadedServer(data_service, port=12345, auto_register=False) 
   s.start() 

这运行了一段时间。然而,程序有时会崩溃,到目前为止我还无法跟踪它何时崩溃。

我想确认的是,了解如何在 data_service 类之外创建数据库连接。这本身可能会导致问题吗?

非常感谢任何想法。

请您参考如下方法:

我认为问题不在于您在类外创建连接,这应该没问题。

我认为问题在于您只创建了一个游标并使用了很长时间,据我所知这不是游标的使用方式。

您可以使用 conn.execute 而无需手动创建游标,这应该适合您使用数据库的方式。如果我没记错的话,这在幕后为每个 SQL 命令创建了一个新游标。您也可以在 get_some_data() 中自己执行此操作:创建一个新游标,使用一次,然后在返回数据之前关闭它。

从长远来看,如果您希望您的服务器更健壮,则需要为数据库操作失败或连接丢失时添加一些错误处理。

最后一点:基本上您已经编写了一个非常基本的数据库代理服务器。可能已经有各种现有的解决方案,它们已经处理了您可能遇到的许多问题。我建议至少考虑使用现有的解决方案。