我将应用程序从SQLObject切换到SQLAlchemy,因为它的开发和社区更加活跃。
两个ORM完全不同。 SQLObject没有事务,并且具有自己的缓存。 SQLAlchemy具有会话缓存,但是在session.commit之后过期。启用自动提交会消除任何缓存。
session.commit之后缓存过期将大大降低性能。
我研究了Dogpile缓存,但是看起来它缓存特定的查询而不是对象。我正在寻找在session.commit之后仍然存在的对象层缓存。也就是说,如果我执行order.Item,则应检查缓存中是否有order.ItemID,如果不在其中,请转到数据库并将order.Item添加到缓存中。
编辑:
我刚刚发现了expire_on_commit标志:
Session = sqlalchemy.orm.sessionmaker(bind=engine, expire_on_commit=False)
SQLAlchemy的创建者说this:
因此,很长时间以来,默认值为0.4,“永远,甚至不可能”。提交没有过期时间,当时我认为除非您绝对要放弃所有已加载的出色数据,否则这是疯狂的。
使用SQLObject时,我已关闭了缓存,因此我已经在手动使对象过期。因此,关闭expire_on_commit应该会使过渡更加自然。