SQLAlchemy中缓存对象的线程安全性

时间:2015-05-27 13:44:05

标签: multithreading session caching sqlalchemy

我是SQLAlchemy的新手并且有一个新手问题,希望有人可以帮助我。我正在开发一个Web应用程序,并希望能够执行以下三个步骤:

  1. 创建一个SQLAlchemy session进行一些查询,并将结果保存在缓存中
  2. 在缓存中使用缓存对象而不触及数据库。
  3. (一段时间后,可能在另一个线程中)更新缓存中保存的对象之一,并创建另一个session以将更改提交回数据库。
  4. 根据我对docs(下面引用)的最佳理解,一个session返回的对象不应与另一个session共享。

      

    确保Session一次只用在一个并发线程中称为“无共享”并发方法。但实际上,不共享会话意味着更重要的模式;它不仅意味着Session对象本身,还意味着与该Session关联的所有对象必须保持在单个并发线程的范围内。

    因此,我采用以下相当繁琐的方法来执行上述步骤,但我想知道是否有更简单,更清洁的方法。谢谢!

    我目前的方法:定义两个具有相同字段的数据结构,一个用于与SQLAlchemy交互,一个用于保存在缓存中。

    class DBItem(Base):
        __tablename__ = "item" 
        # Some fields.
    
    class Item():
        # Same fields as DBItem.
    
    # Step 1: query database and save to cache.
    session = Session()
    db_item = session.query(...).first()
    item = copy_DBItem_to_Item(db_item)
    cache.set("some-key", item)
    session.close()
    
    # Step 2: use the cached item
    item = cache.get("some-key")
    # use `item` in a read-only fashion
    
    # Step 3: update the item in cache and in database.
    item = cache.get("some-key")
    session = Session()
    db_item = session.query(...).first()
    # Perform the same update to `item` and `db_item`.
    session.commit()
    session.close()
    

0 个答案:

没有答案