Mysql 与许多用户一起使用Plone 4和pas.plugins.sqlalchemy

Mysql 与许多用户一起使用Plone 4和pas.plugins.sqlalchemy,mysql,sql,sqlalchemy,plone,zope,Mysql,Sql,Sqlalchemy,Plone,Zope,我一直在使用pas.plugins.sqlalchemy为身份验证和memberdata存储提供RDBMS后端,使用MySQL。身份验证工作正常,成员数据在RDBMS上正确存储和检索。当前用户超过20.000人 但是,用户枚举需要很长时间。我已经检查了Plone控制面板/用户和组部分中的“许多用户”,但即使是简单的用户搜索也需要花费几乎无限的时间。通过调试plugin.py脚本,我注意到调用enumerateUsers()的次数与存储的用户数相同;因此,完成一个简单的搜索请求需要大量的CPU时间

我一直在使用pas.plugins.sqlalchemy为身份验证和memberdata存储提供RDBMS后端,使用MySQL。身份验证工作正常,成员数据在RDBMS上正确存储和检索。当前用户超过20.000人

但是,用户枚举需要很长时间。我已经检查了Plone控制面板/用户和组部分中的“许多用户”,但即使是简单的用户搜索也需要花费几乎无限的时间。通过调试plugin.py脚本,我注意到调用enumerateUsers()的次数与存储的用户数相同;因此,完成一个简单的搜索请求需要大量的CPU时间,因为查询与每个用户名匹配,一次一个用户,一次一个查询


我是不是遗漏了什么?pas.plugins.sqlalchemy不是很有用吗,尤其是当用户数量非常大的时候?目前,在我的*acl_users/plugins/User Enumeration*设置中,sql插件是最重要的。我应该改变这一点吗?

我几乎继承了维护pas.plugins.sqlalchemy——但我个人还没有为少数用户使用过它。如果你在上提交一个bug,我会看看我能做些什么


我不认为枚举的顺序有多大区别,它仍然必须枚举SQL数据库中的所有用户。因此,它要么在ZODB中找到的之前执行,要么在之后执行。听起来好像问题是从Zope开始的——每个用户调用enumerateUsers()一次似乎太多了——但即便如此,也不必为每个枚举向关系数据库发出请求。

是否没有实现缓存?通常,您可以将这些内容与RAMCacheManager关联,或者在插件级别上实现缓存(例如,通过plone.memoize),这通常会有很大帮助。@Sentinel否,插件级别上没有实现缓存。我猜这在Plone 4中发生了变化,因为用户和组控制面板现在尝试显示每个用户的全名…这需要一个属性查找来触发额外的enumerateUsers调用。它暂停的确切点是Plone/app/controlpanel/usergroups。py:168