尝试将数据库查询结果提供给临时客户端请求,但不想为每个单独的查询打开连接。我不确定我做的是否正确。
当前的解决方案在“服务器”端是这样的(为清楚起见,已大幅缩减):
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() 中自己执行此操作:创建一个新游标,使用一次,然后在返回数据之前关闭它。
从长远来看,如果您希望您的服务器更健壮,则需要为数据库操作失败或连接丢失时添加一些错误处理。
最后一点:基本上您已经编写了一个非常基本的数据库代理服务器。可能已经有各种现有的解决方案,它们已经处理了您可能遇到的许多问题。我建议至少考虑使用现有的解决方案。
