數(shù)據(jù)庫設(shè)計(jì)的難點(diǎn)之一,是session生命周期的管理問題。sqlalchemy提供了一個(gè)簡單的session管理機(jī)制,即scoped session。它采用的注冊模式。所謂的注冊模式,簡單來說,是指在整個(gè)程序運(yùn)行的過程當(dāng)中,只存在唯一的一個(gè)session對象。
創(chuàng)建scoped session的方法如下
from sqlalchemy.orm import scoped_sessionfrom sqlalchemy.orm import sessionmakersession_factory = sessionmaker(bind=some_engine)Session = scoped_session(session_factory)scoped_session本質(zhì)上也是一個(gè)方法,它首先通過session工廠創(chuàng)建session對象,然后對session對象進(jìn)行相應(yīng)的管理。如果需要?jiǎng)?chuàng)建session對象,可執(zhí)行下面的代碼。
some_session = Session()注意,由于scoped session采用的是注冊模式,因此下面代碼的session1和session2是一個(gè)相同的對象引用。session1 = Session()session2 = Session()但是下面代碼中的session1和session2是不同的對象引用。因?yàn)閟ession2創(chuàng)建之前,session1已經(jīng)被銷毀。
session1 = Session()session1.remove()session2 = Session()介紹到這里,我們知道scoped session本質(zhì)上是一個(gè)全局變量??墒牵绻苯影裺ession定義成全局變量,在多線程的環(huán)境下,會(huì)造成線程同步的問題。為此,scoped session在默認(rèn)情況下,采用的線程本地化存儲方式。也就是說,每個(gè)線程的session對象是不同的。這樣,不同線程對數(shù)據(jù)庫的操作不會(huì)相互影響。
新聞熱點(diǎn)
疑難解答
圖片精選