財哥的地盤

          家窮人丑,一米四九

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            21 Posts :: 19 Stories :: 3 Comments :: 0 Trackbacks
          Session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,并返回與之對應的實體對象。其區別在于:

          如果未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException。
          Load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。
          load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。
          Session在加載實體對象時,將經過的過程:

          首先,Hibernate中維持了兩級緩存。第一級緩存由Session實例維護,其中保持了Session當前所有關聯實體的數據,也稱為內部緩存。而第二級緩存則存在于SessionFactory層次,由當前所有由本SessionFactory構造的Session實例共享。出于性能考慮,避免無謂的數據庫訪問,Session在調用數據庫查詢功能之前,會先在緩存中進行查詢。首先在第一級緩存中,通過實體類型和id進行查找,如果第一級緩存查找命中,且數據狀態合法,則直接返回。
          之后,Session會在當前“NonExists”記錄中進行查找,如果“NonExists”記錄中存在同樣的查詢條件,則返回null。“NonExists”記錄了當前Session實例在之前所有查詢操作中,未能查詢到有效數據的查詢條件(相當于一個查詢黑名單列表)。如此一來,如果Session中一個無效的查詢條件重復出現,即可迅速作出判斷,從而獲得最佳的性能表現。
          對于load方法而言,如果內部緩存中未發現有效數據,則查詢第二級緩存,如果第二級緩存命中,則返回。
          如在緩存中未發現有效數據,則發起數據庫查詢操作(Select SQL),如經過查詢未發現對應記錄,則將此次查詢的信息在“NonExists”中加以記錄,并返回null。
          根據映射配置和Select SQL得到的ResultSet,創建對應的數據對象。
          將其數據對象納入當前Session實體管理容器(一級緩存)。
          執行Interceptor.onLoad方法(如果有對應的Interceptor)。
          將數據對象納入二級緩存。
          如果數據對象實現了LifeCycle接口,則調用數據對象的onLoad方法。
          返回數據對象。
          posted on 2008-03-30 13:41 楊景 閱讀(568) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 南丹县| 翁牛特旗| 安徽省| 洮南市| 晋宁县| 海盐县| 隆尧县| 宜章县| 共和县| 驻马店市| 永善县| 隆林| 洪洞县| 黑水县| 天水市| 林甸县| 长兴县| 额尔古纳市| 湖南省| 汉川市| 锦州市| 沙河市| 黔西| 九龙坡区| 丽水市| 两当县| 龙口市| 繁峙县| 哈巴河县| 河间市| 甘洛县| 专栏| 巴中市| 图片| 东阳市| 增城市| 拉萨市| 图木舒克市| 文登市| 五指山市| 丹凤县|