尝试将数据库查询结果提供给adhoc客户端请求,但不希望为每个单独的查询打开连接。我不确定我是否做得对。
目前的解决方案在"服务器"一面(为清晰起见严重减少):
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类之外创建数据库连接。这本身可能会导致问题吗?
非常感谢任何想法。
答案 0 :(得分:1)
我不认为问题是你在课外创建连接,应该没问题。
我认为问题在于你只创建了一个游标并长时间使用它,据我所知,并不是游标的使用方式。
您可以使用conn.execute
而无需手动创建游标,这对于您使用数据库的方式应该没问题。如果我没记错的话,在幕后这将为每个SQL命令创建一个新的游标。您也可以在get_some_data()
中自己执行此操作:创建一个新游标,使用一次,然后在返回数据之前将其关闭。
从长远来看,如果您希望服务器更强大,则需要在数据库操作失败或连接丢失时添加一些错误处理。
最后一点:基本上你已经编写了一个非常基本的数据库代理服务器。可能已经存在各种现有的解决方案,这些解决方案已经处理了很多可能遇到的问题。我建议至少考虑使用现有的解决方案。