財哥的地盤

          家窮人丑,一米四九

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

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

          首先,Hibernate中維持了兩級緩存。第一級緩存由Session實例維護(hù),其中保持了Session當(dāng)前所有關(guān)聯(lián)實體的數(shù)據(jù),也稱為內(nèi)部緩存。而第二級緩存則存在于SessionFactory層次,由當(dāng)前所有由本SessionFactory構(gòu)造的Session實例共享。出于性能考慮,避免無謂的數(shù)據(jù)庫訪問,Session在調(diào)用數(shù)據(jù)庫查詢功能之前,會先在緩存中進(jìn)行查詢。首先在第一級緩存中,通過實體類型和id進(jìn)行查找,如果第一級緩存查找命中,且數(shù)據(jù)狀態(tài)合法,則直接返回。
          之后,Session會在當(dāng)前“NonExists”記錄中進(jìn)行查找,如果“NonExists”記錄中存在同樣的查詢條件,則返回null。“NonExists”記錄了當(dāng)前Session實例在之前所有查詢操作中,未能查詢到有效數(shù)據(jù)的查詢條件(相當(dāng)于一個查詢黑名單列表)。如此一來,如果Session中一個無效的查詢條件重復(fù)出現(xiàn),即可迅速作出判斷,從而獲得最佳的性能表現(xiàn)。
          對于load方法而言,如果內(nèi)部緩存中未發(fā)現(xiàn)有效數(shù)據(jù),則查詢第二級緩存,如果第二級緩存命中,則返回。
          如在緩存中未發(fā)現(xiàn)有效數(shù)據(jù),則發(fā)起數(shù)據(jù)庫查詢操作(Select SQL),如經(jīng)過查詢未發(fā)現(xiàn)對應(yīng)記錄,則將此次查詢的信息在“NonExists”中加以記錄,并返回null。
          根據(jù)映射配置和Select SQL得到的ResultSet,創(chuàng)建對應(yīng)的數(shù)據(jù)對象。
          將其數(shù)據(jù)對象納入當(dāng)前Session實體管理容器(一級緩存)。
          執(zhí)行Interceptor.onLoad方法(如果有對應(yīng)的Interceptor)。
          將數(shù)據(jù)對象納入二級緩存。
          如果數(shù)據(jù)對象實現(xiàn)了LifeCycle接口,則調(diào)用數(shù)據(jù)對象的onLoad方法。
          返回數(shù)據(jù)對象。
          posted on 2008-03-30 13:41 楊景 閱讀(568) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 马鞍山市| 崇阳县| 洪泽县| 尚志市| 漠河县| 黄大仙区| 沙雅县| 东莞市| 绵竹市| 佛学| 宜兴市| 饶平县| 炉霍县| 布拖县| 浦北县| 微山县| 新乡县| 安化县| 广昌县| 清徐县| 泸西县| 阳信县| 阳高县| 麻江县| 黎川县| 镇安县| 荔波县| 象山县| 电白县| 宝坻区| 滁州市| 玉溪市| 紫云| 九江市| 宜章县| 遵义县| 澄江县| 定西市| 工布江达县| 福州市| 莱州市|