SQLAlchemy 对象缓存和刷新

SQLAlchemy 带有对象缓存机制,在重复查询相同的对象时,直接先查询本地的缓存,而不需要从数据库加载数据。

在每个 model 对象的内部,SQLAlchemy 在对象的 __dict__ 中维护对象的状态。它往 __dict__ 中加入对象的状态 _sa_instance_state,通过这个值来跟踪对象。_sa_instance_statesqlalchemy.orm.state.InstanceState 类型,里面保存这个对象的 session 、orm mapper 等等信息。

在一般的情况下,这种方法会非常高效。但如果在进行跨进程操作时,如果不加以特别的处理,对象缓存机制会导致一个进程无法取得另外一个进程的对象更新情况。

假设两个进程 A,B,A 在操作 object 的更新,B 等待 object 的状态,如下:

A 进程

object = session.query(MyObject).first()
# do something
with session.begin():
object.status = 'SUCCESS'

B 进程

while True:
object = session.query(MyObject).first()
if object.status == 'SUCCESS':
# do something
break
sleep(10)

在 B 进程中,虽然每次循环都进行查询,但由于缓存机制,其实只有第一次会从数据库加载,在数据过期前,都是直接读取缓存,所以 B 进程会一直在等待状态。

解决的方法是进行对象刷新。对于这些需要每次更新状态的对象,通过 session.refresh(object)session.expire(object),让对象过期,从而在下次访问时重新加载。

B 进程

object = session.query(MyObject).first()
while True:
if object.status == 'SUCCESS':
# do something
break
session.refresh(object)
sleep(10)

session.refreshsession.expire 支持只刷新特定的属性,如

session.refresh(object, ['status'])

这种做法就降低重新加载时所传递的数据量,具有 BLOB 大数据量的字段可又不重新加载。

最新文章

  1. 读书笔记--SQL必知必会18--视图
  2. 搬-Android - Wi-Fi Tutorial[转]
  3. 二、JavaScript语言--JS实践--信息滚动效果制作
  4. Eclipse下配置tomcat且使用eclipse开启debug模式,集成JAD反编译插件
  5. #!--->hashbang技术
  6. Codeforces Round #313 (Div. 2) A. Currency System in Geraldion 水题
  7. 学习C++ Primer 的个人理解(六)
  8. mybatis源代码分析:深入了解mybatis延迟加载机制
  9. iframe,modaldialog父子窗口相互通信的问题
  10. Jmeter(四)-断言/检查点
  11. MongoDB3.4安装配置以及与Robomongo1.1的连接——解决Authentication Failed导致的不能连接问题
  12. shell 变量的使用
  13. 20165319 Exp6 信息收集与漏洞扫描
  14. elasticsearch 修改磁盘比例限制
  15. 前端测试框架Jest系列教程 -- Mock Functions(模拟器)
  16. Privoxy将Socks代理转化HTTP代理
  17. 每天一个linux命令(9):touch
  18. python接口自动化测试二十八:连接SQL sever操作
  19. 熔断监控面板(Hystrix Dashboard)
  20. CentOS 下搭建Gitlab

热门文章

  1. Html - 幽灵键盘
  2. 滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之
  3. win7(32/64)+apache2.4+php5.5+mysql5.6 环境搭建配置
  4. SEP图示
  5. 18. 求交错序列前N项和
  6. 关于Depth Bounds Test (DBT)和在CE3的运用
  7. 23个MySQL常用查询语句
  8. PHP pear安装
  9. (一)win7下cocos2d-x 21 + vs2010
  10. 读取C#AssemblyInfo文件中的AssemblyVersion中的值