新聞中心
數(shù)據(jù)庫session是指在數(shù)據(jù)庫中建立的一個會話,它通常是由客戶端應用程序與數(shù)據(jù)庫建立連接時創(chuàng)建的。數(shù)據(jù)庫session可以看作是一次對數(shù)據(jù)庫的訪問,包括對數(shù)據(jù)的增刪改查以及其他一些操作。在本文中,我們將深入探討數(shù)據(jù)庫session的定義和作用。

創(chuàng)新互聯(lián)建站是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護、網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站備案、服務(wù)器租用、域名申請、軟件開發(fā)、小程序設(shè)計等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運營推廣經(jīng)驗的科技公司,有著多年的網(wǎng)站建站經(jīng)驗,致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個面向全國乃至全球的業(yè)務(wù)窗口:建站服務(wù)熱線:18980820575
1. 數(shù)據(jù)庫session的定義
數(shù)據(jù)庫session是指從客戶端與數(shù)據(jù)庫建立連接時開始,直到這個連接被關(guān)閉時結(jié)束的一段時間,這段時間中所有與數(shù)據(jù)庫的交互都被認為是在同一個session中進行的。通常情況下,每個session與一個特定的用戶(或應用程序)相關(guān)聯(lián)。在Oracle數(shù)據(jù)庫中,每個session都有一個唯一的標識符,稱為session ID。
2. 數(shù)據(jù)庫session的作用
在數(shù)據(jù)庫中,session是一個非常重要的概念。它對數(shù)據(jù)庫的操作、安全性和性能都有著非常大的影響。因此,了解session的作用是非常必要的。
2.1 數(shù)據(jù)庫操作
在數(shù)據(jù)庫中,session主要用于執(zhí)行數(shù)據(jù)庫操作,如查詢、插入、更新和刪除等。當客戶端與數(shù)據(jù)庫建立連接時,一個session對象被創(chuàng)建,并在整個連接的過程中一直存在。通過session,客戶端可以向數(shù)據(jù)庫發(fā)送SQL語句,以執(zhí)行各種數(shù)據(jù)庫操作。當客戶端完成操作后,可以關(guān)閉連接,這將終止session的生命周期。
2.2 安全性控制
數(shù)據(jù)庫session在安全性控制方面發(fā)揮著非常重要的作用。每個session都與一個特定的用戶或應用程序相關(guān)聯(lián),數(shù)據(jù)庫可以通過session信息來控制對數(shù)據(jù)庫的訪問權(quán)限。例如,數(shù)據(jù)庫管理員可以通過session控制對敏感數(shù)據(jù)的訪問,限制非法用戶訪問某些數(shù)據(jù)。
2.3 提高性能
數(shù)據(jù)庫session還可以在性能方面發(fā)揮重要作用。通過session對象,數(shù)據(jù)庫可以跟蹤一個客戶端的所有操作。數(shù)據(jù)庫可以使用session信息來識別執(zhí)行查詢的客戶端,并在服務(wù)器端維護緩存,從而提高訪問數(shù)據(jù)的速度。此外,session還可以在連接池中重用以減少數(shù)據(jù)庫連接的開銷。
3.
在本文中,我們深入探討了數(shù)據(jù)庫session的定義和作用。我們了解到,session是從客戶端與數(shù)據(jù)庫建立連接時開始直到連接關(guān)閉時結(jié)束的一段時間,它對數(shù)據(jù)庫的操作、安全性和性能都有著非常大的影響。有了對session的深入了解,我們可以更好地理解數(shù)據(jù)庫運行機制,從而更好地設(shè)計和管理數(shù)據(jù)庫應用程序。
相關(guān)問題拓展閱讀:
- SQLAlchemy 中的 Session、sessionmaker、scoped_session
SQLAlchemy 中的 Session、sessionmaker、scoped_session
目錄
Session 其實 就是一個會話, 可以和數(shù)據(jù)庫打交道的一個會話
在一般的意義上, 會話建立與數(shù)據(jù)庫的所有對話,并為你在其生命周期中加載或關(guān)聯(lián)的所有對象表示一個“等待區(qū)”。他提供了一個入口點獲得查詢對象, 向數(shù)據(jù)庫發(fā)送查詢,使用會話對象的當前數(shù)據(jù)庫連接, 將結(jié)果行填充在對象中, 然后存儲在會話中, 在這種結(jié)構(gòu)中稱為身份映射 – 這種數(shù)據(jù)結(jié)構(gòu)維護了每一個副本的唯一, 這種唯一意味著一個對象只能有一個特殊的唯一主鍵。
會話以基本無狀態(tài)的形式開始,一旦發(fā)出查詢或其他對象被持久化,它就會從一個引擎申請連接資源,該引擎要么與會話本身相關(guān)聯(lián),要么與正在操作的映射對象相關(guān)聯(lián)。此連接標識正在進行的事務(wù), 在會話提交或回滾其掛起狀態(tài)之前,該事務(wù)一直有效。
會話中維護的所有變化的對象都會被跟蹤 – 在再次查詢數(shù)據(jù)庫或提交當前事務(wù)之前, 它將刷新對數(shù)據(jù)庫的所有更改, 這被稱為工作模式單元。
在使用會話時候,最重要的是要注意與它相關(guān)聯(lián)的對象是會話所持有的事務(wù)的代理對象 – 為了保持同步,有各種各樣的事件會導致對象重新訪問數(shù)據(jù)庫??赡軓臅捴蟹蛛x對象并繼續(xù)使用他們,盡管這種做法有其局限性。但是通常來說,當你希望再次使用分離的對象時候,你會將他們與另一個會話重新關(guān)聯(lián)起來, 以便他們能夠恢復表示數(shù)據(jù)庫狀態(tài)的正常任務(wù)。
可能會將這里的session與http中的session搞混,需要注意的是,它有點用作緩存,因為它實現(xiàn)了 身份映射 模式,并存儲了鍵入其主鍵的對象。但是,它不執(zhí)行任何類型的查詢緩存。 此外,默認情況下,Session使用弱引用存儲對象實例。這也違背了將Session用作緩存的目的。關(guān)于session強應用下次再討論。
1. session創(chuàng)建和管理數(shù)據(jù)庫連接的會話 2. model object 通過session對象訪問數(shù)據(jù)庫,并把訪問到的數(shù)據(jù)以 Identity Map 的方式,映射到Model object 中
1. session在剛被創(chuàng)建的時候,還沒有和任何model object 綁定,可認為是無狀態(tài)的 2. session 接受到query查詢語句, 執(zhí)行的結(jié)果或保持或者關(guān)聯(lián)到session中 3. 任意數(shù)量的model object被創(chuàng)建,并綁定到session中,session會管理這些對象 4. 一旦session 里面的objects 有變化,那可是要commit/rollback提交或者放棄changs
一般來說,session在需要訪問數(shù)據(jù)庫的時候創(chuàng)建,在session訪問數(shù)據(jù)庫的時候,準確來說,應該是“add/ update / delete ”數(shù)據(jù)庫的時候,會開啟 database transaction 。 假設(shè)沒有修改autocommit的默認值( False ), 那么, database transaction 一直會保持,只有等到 session 發(fā)生rolled back、committed、或者closed的時候才結(jié)束,一般建議,當 database transaction 結(jié)束的時候,同時 close session ,以保證,每次發(fā)起請求,都會創(chuàng)建一個新的 session 特別是對web應用來說,發(fā)起一個請求,若請求使用到 Session 訪問數(shù)據(jù)庫,則創(chuàng)建 session ,處理完這個請求后,關(guān)閉 session
Session 是一個直接實例化的常規(guī)的Python 類。然而, 為了標準會會話的配置和獲取方式, sessionmaker 類通常用于創(chuàng)建頂級會話配置, 然后可以在整個應用程序中使用它, 就不需要重復配置參數(shù)。
下面是sessionmaker 的使用方式
在上面,該
sessionmaker()創(chuàng)建了一個工廠類,在創(chuàng)建這個工廠類時我們配置了參數(shù)綁定了引擎。將其賦值給Session。每次實例化Session都會創(chuàng)建一個綁定了引擎的Session。
這樣這個session在訪問數(shù)據(jù)庫時都會通過這個綁定好的引擎來獲取連接資源當你編寫應用程序時, 請將sessionmaker 工廠放在全局級別,視作應用程序配置的一部分。例如:應用程序包中有三個.py文件,您可以將該sessionmaker行放在__init__.py文件中; 在其他模塊“from mypackage import Session”。這樣,所有的Session()的配置都由該配置中心控制。
直接只用 create_engine 時,就會創(chuàng)建一個帶連接池的引擎:
創(chuàng)建一個session,連接池會分配一個connection。當session在使用后顯示地調(diào)用 session.close(),也不能把這個連接關(guān)閉,而是由由QueuePool連接池管理并復用連接。
確保 session 在使用完成后用 session.close、session.commit 或 session.rollback 把連接還回 pool,這是一個必須在意的習慣。
關(guān)于SQLAlchemy 數(shù)據(jù)庫連接池:
session 和 connection 不是相同的東西, session 使用連接來操作數(shù)據(jù)庫,一旦任務(wù)完成 session 會將數(shù)據(jù)庫 connection 交還給 pool。 在使用 create_engine 創(chuàng)建引擎時,如果默認不指定連接池設(shè)置的話,一般情況下,SQLAlchemy 會使用一個 QueuePool 綁定在新創(chuàng)建的引擎上。并附上合適的連接池參數(shù)
create_engine() 函數(shù)和連接池相關(guān)的參數(shù)有:
SQLAlchemy不使用連接池:在創(chuàng)建引擎時指定參數(shù) poolclass=NullPool 即禁用了SQLAlchemy提供的數(shù)據(jù)庫連接池。SQLAlchemy 就會在執(zhí)行 session.close() 后立刻斷開數(shù)據(jù)庫連接。當然,如果沒有被調(diào)用 session.close(),則數(shù)據(jù)庫連接不會被斷開,直到程序終止。
關(guān)于 SQLAlchemy 的 engine ,這里有一篇文章寫的很好:
session不是線程安全的,在多線程的環(huán)境中,默認情況下,多個線程將會共享同一個session。試想一下,假設(shè)A線程正在使用session處理數(shù)據(jù)庫,B線程已經(jīng)執(zhí)行完成,把session給close了,那么此時A在使用session就會報錯,怎么避免這個問題?
1 . 可以考慮在這些線程之間共享Session及其對象。但是應用程序需要確保實現(xiàn)正確的鎖定方案,以便多個線程不會同時訪問Session或其狀態(tài)。SQLAlchemy 中的 scoped_session 就可以證線程安全,下面會有討論。 2 . 為每個并發(fā)線程維護一個會話,而不是將對象從一個Session復制到另一個Session,通常使用Session.merge()方法將對象的狀態(tài)復制到一個不同Session的新的本地對象中。
上面簡單介紹了sessionmaker的作用,下面開始探討 scoped_session 對創(chuàng)建 Session 的影響?,F(xiàn)在先探討單線程情況。
結(jié)論:
通過 sessionmaker 工廠創(chuàng)建了兩個 Session ,而且可以看到 s1 s2 是兩個不同的 Session 。 在 s1 添加 person 后,繼續(xù)使用 s2 添加 person 報錯. 說 person 這個對象 已經(jīng)和 另一個 Session 關(guān)聯(lián)一起來了, 所以再次關(guān)聯(lián)另一個 Session 就會報錯。
即在上面代碼的 s1.add(person) 之后, s1.commit() ,然后再 s2.add(persion)這里就沒帖代碼了。
結(jié)論:
即使在 s1 提交之后, s2 再去添加 person 也會發(fā)生錯誤,但 s1 的提交是成功了的,數(shù)據(jù) person 已經(jīng)存放在數(shù)據(jù)庫了。 當 s1 添加 person 并提交,然后關(guān)閉 s1 , s2 再去添加并提交 person 數(shù)據(jù)庫,這不會報錯,但是數(shù)據(jù)庫也不會出現(xiàn)兩條 person 數(shù)據(jù)。
結(jié)論:
s1 關(guān)閉之后, s2 再去添加提交同一個對象,不會報錯,但是數(shù)據(jù)庫值有一條 person 數(shù)據(jù)。
結(jié)論:
當然, s1 , s2 添加提交不同的對象,不會出錯。在數(shù)據(jù)庫成功新增數(shù)據(jù)。
以上說明:
一個對象一旦被一個 Session 添加,除非關(guān)閉這個 Session ,不然其他的 Session 無法添加這個對象。 一個 Session 添加并提交一個對象,然后關(guān)閉該 Session ,其他的 Session 可以添加并提交這個對象,但是數(shù)據(jù)庫并不會有這條數(shù)據(jù)。
結(jié)論:
可以看到,通過 scoped_session再去創(chuàng)建 Session ,返回的是同一個 Session 。 scoped_session類似單例模式,當我們調(diào)用使用的時候,會先在Registry里找找之前是否已經(jīng)創(chuàng)建Session,未創(chuàng)建則創(chuàng)建 Session ,已創(chuàng)建則直接返回。
這里探討在多線程下使用 scoped_session 與不使用 scoped_session 的情況
當不使用 scoped_session 時,也分兩種情況,是否創(chuàng)建全局性 Session
結(jié)論:
每個線程下的 Session 都是不同的 Session 數(shù)據(jù)庫成功新增了線程3提交的數(shù)據(jù),其他的線程中的數(shù)據(jù)并沒有提交到數(shù)據(jù)庫中去。
結(jié)論:
全部線程下的 Session 都時同一個 Session 每個線程下的數(shù)據(jù)都被提交到了數(shù)據(jù)庫
結(jié)論:
每個線程下的 Session 都不相同 只有線程3下的數(shù)據(jù)被提交到了數(shù)據(jù)庫
結(jié)論:
每個線程下的 Session 是同一個 Session 每個線程下的數(shù)據(jù)都沒提交到了數(shù)據(jù)庫
以上說明:
在同一個線程中,有 scoped_session 的時候,返回的是同一個 Session 對象。 在多線程下,即使通過 scoped_session 創(chuàng)建Session,每個線程下的 Session 都是不一樣的,每個線程都有一個屬于自己的 Session 對象,這個對象只在本線程下共享。 scoped_session 只有在單線程下才能發(fā)揮其作用。在多線程下顯得沒有什么作用。
關(guān)于數(shù)據(jù)庫session是什么的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
本文名稱:深入探討:數(shù)據(jù)庫session的定義和作用(數(shù)據(jù)庫session是什么)
網(wǎng)站鏈接:http://www.fisionsoft.com.cn/article/cdsdjpc.html


咨詢
建站咨詢
