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

时间:2011-11-06 07:28:19

标签: python rpyc

尝试将数据库查询结果提供给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类之外创建数据库连接。这本身可能会导致问题吗?

非常感谢任何想法。

1 个答案:

答案 0 :(得分:1)

我不认为问题是你在课外创建连接,应该没问题。

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

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

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

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