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 大数据量的字段可又不重新加载。

SQLAlchemy 对象缓存和刷新的更多相关文章

  1. sqlalchemy的缓存和刷新

    其实只是第一次查询了数据库,其他的时候都使用的是缓存,所以有时候,因为这个特性会出错,所以需要刷新对象或者使对象过期 参考链接:http://www.cnblogs.com/fengyc/p/5369 ...

  2. 分布式内存对象缓存系统Memcached-概述

    全面掌握Memcached 1.       概述 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,是为了加快网站http://www. ...

  3. Python并发编程-Memcached (分布式内存对象缓存系统)

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...

  4. 从SQLAlchemy的“缓存”问题说起

    https://www.jianshu.com/p/c0a8275cce99 0.4792017.11.22 00:07:04字数 1631阅读 6493 问题描述 最近在排查一个问题,为了方便说明, ...

  5. spring ehcache 页面、对象缓存

    一.Ehcache基本用法 CacheManager cacheManager = CacheManager.create(); // 或者 cacheManager = CacheManager.g ...

  6. Ehcache 整合Spring 使用页面、对象缓存

    Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一 般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布 ...

  7. (转)Ehcache 整合Spring 使用页面、对象缓存

    Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的 ...

  8. 缓存插件 EHCache 对象缓存(Spring)

    对象缓存就是将查询的数据,添加到缓存中,下次再次查询的时候直接从缓存中获取,而不去数据库中查询. 对象缓存一般是针对方法.类而来的,结合Spring的Aop对象.方法缓存就很简单.这里需要用到切面编程 ...

  9. 高性能的分布式内存对象缓存系统Memcached

    Memcached概述   什么是Memcached? 先看看下面几个概念: Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所缓存的内容非持久化.对于CPU要求很低,所以常常采 ...

随机推荐

  1. Leetcode | Minimum/Maximum Depth of Binary Tree

    Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...

  2. 学习SSH框架

    1.SSH框架的认知 在做相关的java的网页的开发制作时,良好的层次分解是十分有比要的,所以我们在云涌第三方的框架之下来简化还有名了我们相关的网站的开发. SSH框架实则为Struct + spri ...

  3. HDU 1257 最少拦截系统(Dilworth定理+LIS)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. HDU 2795 Billboard(线段树的另类应用)

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 《Java核心技术卷一》笔记 多线程

    有时,我们需要在一个程序中同时并行的处理多个任务,如播放器一边要播放音乐同时还要不断更新画面显示,或者是一边执行耗时任务,UI还能一边继续响应各种事件.还有的时候,一个任务需要很长时间才能完成,如果分 ...

  6. fleetctl --help

    NAME:    fleetctl - fleetctl is a command-line interface to fleet, the cluster-wide CoreOS init syst ...

  7. jquery格式化时间戳 2011-01-01

    /*                * 时间戳转换日期                * @param  <int>  unixTime    待时间戳(秒)               ...

  8. mysql 将null转代为0

    mysql 将null转代为0 分类: Mysql2012-12-15 11:56 6447人阅读 评论(1) 收藏 举报 1.如果为空返回0 select ifnull(null,0) 2.如果为空 ...

  9. coursera python 学习总结

    为啥要写这篇总结?早上突然想到了四个字:知行合一.实践,总结,再实践,再总结经验,积累经验,为己所用.闲话少叙,来干货: 1.目标要单一,如果想要完成课程,还要健身,还要玩玩游戏.看看电影,还学别的课 ...

  10. von Neumann architecture

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION 3.1 COMPUTER COMPONEN ...