Django中的Cassandra连接池

时间:2017-09-11 18:44:10

标签: python django cassandra connection-pooling

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

解决方案是使用连接池,但我不清楚如何在Django中完成此操作?这是我到目前为止所发现的:

  1. 我可以使用像CQL-EngineDjango Cassandra Engine这样的对象映射器,它们可以跨多个请求保持连接。我不需要对象映射器,所以我宁愿跳过使用我不需要的库。当然,我已经在使用Datastax Python驱动程序了,这意味着我可以使用CQL-Engine,但它不是很清楚它是如何帮助的!

  2. 我可以修改我的WSGI并在进程fork之后连接到Cassandra,并与该进程处理的每个请求共享(更多详细信息here)。我目前正在使用mod_wsgi,但我在gunicorn上找到了更多结果(我不介意转换)。对于gunicorn,我可以使用回调post_fork(如this example所示)。我可以连接,但我不确定如何与应用程序共享连接!并且有0个例子。

  3. 我发现在创建应用程序后,如果我在wsgi.py中连接到我的数据库,我可以与我的应用程序共享它(它也适用于mod_wsgi)。我所要做的就是这样:
  4. import os
    import sys
    sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
    sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
    from myapp import keyspace_manager
    from django.conf import settings
    cluster, session = keyspace_manager.initCassandraConnection()
    settings.CLUSTER = cluster
    settings.SESSION = session
    

    然后我可以在我的请求中访问集群/会话对象,而不是每次都初始化它。

    现在我的问题是:这种方法(#3,wsgi.py中的初始连接),对吗?可能出现什么问题? 如果没有,我怎么能在Django中进行Cassandra连接池?

    非常感谢,

0 个答案:

没有答案
相关问题