如何在 grpc 中管理数据库连接?

Fra*_*s C 4 python grpc

我目前正在遵循 grpc 中的一些快速入门教程,添加一些数据库连接,显然每个请求都创建一个数据库连接并不是最佳的

def connection():
    conn = psycopg2.connect(
        user="postgres", password="some_password", database="some_db")
    return conn


class LeagueGameManager(start_pb2_grpc.GameManagerServicer):
    async def CreateLGGame(self, request, context):
        try:
            conn = connection()
            cursor = conn.cursor()

            cursor.execute("some sql statement")

            conn.commit()
            cursor.close()
            conn.close()
        except OperationalError as e:
            context.set_details(e)
            context.set_code(grpc.StatusCode.INTERNAL)
            cursor.close()
            conn.close()
            return

        return start_pb2.GameReply(json_response=json.dumps(new_row[0]))


async def serve():
    server = grpc.aio.server()
    start_pb2_grpc.add_GameManagerServicer_to_server(
        LeagueGameManager(), server)
    listen_addr = '[::]:50051'
    server.add_insecure_port(listen_addr)
    logging.info("Starting server on %s", listen_addr)
    await server.start()
    await server.wait_for_termination()
Run Code Online (Sandbox Code Playgroud)

管理上述数据库连接的最佳方式是什么?

小智 9

我知道我有点晚了,但由于 python 中的 gRPC 没有很好的文档记录,我想帮助未来的访问者。我最近一直在为 gRPC 苦苦挣扎。对我来说,持续连接到数据库的最简单方法是在 Service 类的构造函数中连接到它。就我而言,我连接到 MongoDb,它应该如下所示:

class MyServiceClass(MyServiceClass_pb2_grpc.MyServiceClassServicer):
    def __init__(self) -> None:
        super().__init__()
        self.client = pymongo.MongoClient(CONNSTRING) # Connection to Mongo database
        self.client.server_info()
    async def get_info(self, request, context):
        response_info = MyScript(request.code).get_something()  # Call 
        return MyServiceClasse_pb2.InfoResponse(info= response_info)
async def serve():
    server = grpc.aio.server()
    start_pb2_grpc.add_MyServiceClass_to_server(
        MyServiceClass(), server)
    listen_addr = '[::]:50051'
    server.add_insecure_port(listen_addr)
    logging.info("Starting server on %s", listen_addr)
    await server.start()
    await server.wait_for_termination()
Run Code Online (Sandbox Code Playgroud)