2

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

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

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 类之外创建的。这本身可能会导致问题吗?

非常感谢任何想法赞赏。

4

1 回答 1

1

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

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

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

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

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

于 2011-11-06T10:50:53.050 回答