在Django中只打开一次cassandra连接

时间:2015-07-08 09:03:45

标签: python django session cassandra

我想在Django中只打开一个与我的cassandra数据库的连接。 不幸的是,我没有找到关于这个主题的任何内容。

目前,每当我需要查询时,我都会上课:

class CassConnection():

    def __init__(self):
        self.auth_prov = PlainTextAuthProvider(settings.runtime_settings[k.CASSANDRA_USER],
                                               settings.runtime_settings[k.CASSANDRA_PASSWORD])
        self.cluster = Cluster(settings.runtime_settings[k.CASSANDRA_CLUSTER], auth_provider=self.auth_prov)
        self.session = self.cluster.connect(keyspace=settings.runtime_settings[k.KEYSPACE_TIREREADINGS])
        self.session.row_factory = dict_factory

    def get_session(self):
        return self.session

我在其他类中为每个查询打开一个新的Session:

    self.con = CassConnection()
    self.session = self.con.get_session()

任何提示,如何保持会话打开并通过多个包可以访问它?

1 个答案:

答案 0 :(得分:0)

对于“每个Django进程一个连接”方案,基本上,你想要的是

  • 具有“延迟”连接行为的连接代理类(您已经拥有)(在有人尝试使用连接之前不会连接),
  • 此类的模块全局实例,其他包可以导入,
  • 确保连接正常关闭的方法(cassandra requires正确操作)

最后一点很难成为主要难点,因为没有一个可用选项(主要是atexit.register()__del__(self)方法)可靠性为101%。在您的连接代理上实现__del__(self)可能仍然是最可靠的,只要注意循环依赖(http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python可能是一个很好的阅读)。

另请注意,“每个django进程一个连接”意味着您的连接必须完全是线程安全的,因为每个Django进程通常会有很多线程(取决于您的wsgi容器配置)。

另一个解决方案 - 如果线程安全问题 - 可能是每个请求只有一个连接...