我的前同事创建了一些“经理”类,它们是数据库中键值表的接口。例如,我们有一个 ConfigurationManager ,它映射到数据库中的Configuration表,该表保存具有键(即:“ mailserver”)和值(即:“ 127.0.0.1”)的配置值。
此表可能包含几百个键值项,我们偶尔会从我们的代码中查找其中之一。
为防止每次我们需要配置表中的值时都需要执行查询,他实现了一种方法来“缓存”类列表中的所有值,因此它保留了这些值在类变量中列出。
如果_loaded
变量是True
,则他从数据库中加载列表,否则,他从类变量中返回它,如下所示:
class ConfigurationManager(object):
"""
Provides configuration option values
"""
_all_values = []
_loaded = False
@staticmethod
def value(name):
if not ConfigurationManager._loaded:
ConfigurationManager.load_database()
config = [x for x in ConfigurationManager._all_values if x.conf_name.lower() == name.lower()]
if len(config) > 0:
option = config[0]
return option.conf_value
else:
logger.debug('Configuration value {0} is empty or does not exist.'.format(name))
return None
@staticmethod
def load_database():
"""
Load configuration options from database
"""
from flask import current_app
ConfigurationManager._all_values = Configuration.query.all()
for confval in ConfigurationManager._all_values:
current_app.db_session.expunge(confval)
ConfigurationManager._loaded = True
现在,我必须补充一点,他最初是C#开发人员,这可能是C#中的标准做法。但是,我从未在Python中看到过这样的例子。
实际的问题是,当我在单元测试中对此进行测试时,这似乎可行,但是代码是由Huey Task worker使用生产中的Flask实例运行的。 我们注意到的是,经过一段时间后,尽管它们存在于数据库中,但再也找不到这些值了。 看来我们的类变量缓存已清空。
我怀疑是:
_loaded
位应该
表明需要加载数据,并且理论上应该
工作。如果任何人都可以了解这种“缓存”方法是否有效,以及导致变量在操作中丢失的原因,我将不胜感激。