Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用rpyc一次连接到数据库并提供多个查询_Python_Rpyc - Fatal编程技术网

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

Python 使用rpyc一次连接到数据库并提供多个查询,python,rpyc,Python,Rpyc,尝试将数据库查询结果提供给临时客户端请求,但不希望为每个查询打开连接。我不确定我是否做对了 当前的解决方案在“服务器”端类似于此(为了清晰起见,大量减少): 这个可以运行一段时间。然而,有时程序会崩溃,到目前为止,我还无法跟踪它何时崩溃 我想确认的是,看看数据库连接是如何在data_服务类之外创建的。这本身是否可能导致问题 非常感谢您的宝贵意见。我认为问题不在于您在课堂之外建立了联系,这应该没问题 我认为问题在于您只创建了一个游标,并且使用了很长时间,据我所知,这并不是游标的用途 您可以使用co

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

当前的解决方案在“服务器”端类似于此(为了清晰起见,大量减少):

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

我想确认的是,看看数据库连接是如何在data_服务类之外创建的。这本身是否可能导致问题


非常感谢您的宝贵意见。

我认为问题不在于您在课堂之外建立了联系,这应该没问题

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

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

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


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

感谢heaps。被倾听的感觉真好。我肯定会考虑得到一个简单的数据库代理服务器(以前不知道它的存在)。我很高兴我可以帮助:)顺便问一下,你知道你可以直接连接到远程服务器上的数据库,并使用一个单一的连接来处理多个请求吗?我以为是你干的,但在二读时并不明显。无论如何,除非我真的需要代理,否则我通常会这么做。再次感谢。我在谷歌上搜索了一下,但是发现了一些关于代理的明显的东西,所以我把光标创建部分移到了函数中。到目前为止,它运行良好,对性能没有明显影响,所以今晚应该能够得出结论,它足够稳定。哦,我明白了,你的意思是不使用rpyc。问题是数据是通过web客户端请求的,我不知道如何保持请求之间的连接打开。刚才注意到提到了一些关于线程和游标的内容。经过这么长时间,可能最终找到了罪魁祸首。oracle连接需要使用额外的参数threaded=True创建。这是在文档中,但我没有彻底阅读它。
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()