Python Django中的Cassandra连接池

Python Django中的Cassandra连接池,python,django,cassandra,connection-pooling,Python,Django,Cassandra,Connection Pooling,对Django应用程序(由Apache托管)的大多数请求都需要连接到Cassandra密钥空间并获取/处理数据。目前,我为每个请求打开一个新的连接,即使是最简单的请求也会增加2.5秒的开销 解决方案是使用连接池,但我不太清楚如何在Django中实现这一点?以下是我到目前为止的发现: 我可以使用像或这样的对象映射器,它们在多个请求之间保持连接。我不需要对象映射器,所以我宁愿跳过不需要的库。当然,我已经在使用Datastax Python驱动程序,这意味着我可以使用CQL引擎,但它如何帮助我还不是很

对Django应用程序(由Apache托管)的大多数请求都需要连接到Cassandra密钥空间并获取/处理数据。目前,我为每个请求打开一个新的连接,即使是最简单的请求也会增加2.5秒的开销

解决方案是使用连接池,但我不太清楚如何在Django中实现这一点?以下是我到目前为止的发现:

  • 我可以使用像或这样的对象映射器,它们在多个请求之间保持连接。我不需要对象映射器,所以我宁愿跳过不需要的库。当然,我已经在使用Datastax Python驱动程序,这意味着我可以使用CQL引擎,但它如何帮助我还不是很清楚

  • 我可以在流程分叉之后修改我的WSGI并连接到Cassandra,并将其与该流程处理的每个请求共享(更多详细信息)。我目前正在使用
    mod_wsgi
    ,但我在
    gunicorn
    上发现了更多结果(我不介意切换)。对于
    gunicorn
    有一个回调,
    post\u fork
    ,我可以使用它(如中所示)。在那里我可以连接,但我不知道如何与应用程序共享连接!这里有0个例子

  • 我发现,如果在创建应用程序后在我的
    wsgi.py
    中连接到我的数据库,我可以与我的应用程序共享它(它也可以与
    mod_wsgi
    一起工作)。我所要做的就是这样:
  • 导入操作系统
    导入系统
    sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(_文件__),“../”))
    sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(_文件__),“./”))
    os.Enviro.setdefault(“DJANGO\u设置\u模块”、“myapp.SETTINGS”)
    从django.core.wsgi导入获取\u wsgi\u应用程序
    application=get\u wsgi\u application()
    从myapp导入密钥空间管理器
    从django.conf导入设置
    集群,会话=keyspace_manager.initCassandraConnection()
    settings.CLUSTER=CLUSTER
    settings.SESSION=会话
    
    然后我可以访问请求中的集群/会话对象,而无需每次初始化它

    现在我的问题是:这种方法(#3,wsgi.py中的init连接)正确吗?这可能会出什么问题? 如果没有,我如何在Django中实现Cassandra连接池


    非常感谢,

    当使用mod_wsgi时,多线程进程和多个请求在进程中同时发生更为典型。如果该会话一次只能由一个请求使用,则会出现问题。使用mod_wsgi时,多线程进程和多个请求在进程中同时发生更为典型。如果该会话一次只能由一个请求使用,您将遇到问题。