kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

          準(zhǔn)備這幾天如果有空整理一下,先放在這里。
          要正確理解OpenSessionInView必須具備以下幾個知識點:
          1.
          servlet的多線程模型。
          2.
          Filter的工作原理。
          3.
          ThreadLocal的使用。
          4.
          Hibernate的Session以及Connection的管理。
          5.
          Lazy Load
          6.
          Hibernate的FlushMode
          7.
          Spring的處理分兩種:
                7.1 One session per request   
                7.2 One new session per operation(這里的operation是指一次業(yè)務(wù)操作,例如如果我們的一次請求調(diào)用了某個業(yè)務(wù)方法,而這個方法里面有兩個與Session相關(guān)的操作,則每一個操作都會新開一個Session,但是使用結(jié)束以后并不關(guān)閉,而是注冊到ThreadLocal的deffered close 的變量里面,等到open session in view filter執(zhí)行完畢的最后進(jìn)行一起close, 這樣有個問題就是一個request可能會啟動很多Session,而且這些session之間的一級緩存不能共享,另外Hibernate限制不能在一個session里面load一個po卻在這個session沒有關(guān)閉的情況下面在另外一個session里面save或者update,也就是說同一個po實例同一時間只能跟一個session發(fā)生關(guān)聯(lián),這樣導(dǎo)致的結(jié)果是如果在上面假設(shè)的兩個業(yè)務(wù)方法中的第一個進(jìn)行l(wèi)oad,而在第二個中對load出來的進(jìn)行修改,鐵定會報錯。)

             另外如果是One session per request  (官方說法是叫SingleSession Mode), 會看到在open session in view filter中進(jìn)行了FlushMode.setMode(Never),也就是從來不進(jìn)行flush, 想當(dāng)然地就是只能進(jìn)行read-only的操作。但是沒有關(guān)系,回到HibernateTemplate的模板方法以及SessionFactoryUtil的getSession方法,可以看到我們的業(yè)務(wù)方法發(fā)出的每個請求都會試圖先取到一個session(取session的策略與上面描述的有關(guān)),在取Session的過程中會判斷當(dāng)前的操作是不是配制成read-only的(同時也會注冊transaction sync manager,有spring和Jta兩種),如果不是read-only并且當(dāng)前的flush mode  是 never的話,會把flush mode改成auto,因此就可以進(jìn)行讀寫操作了。


               spring的callback使得所有的操作最后基本歸由HibernateTemplate當(dāng)中的excute方法進(jìn)行處理,對session的管控也是在這里集中進(jìn)行,如果我們自己控制session,有兩種方法,一種是我們也寫callback,讓spring幫我們擦屁股,另外一種是直接調(diào)用HibernateTemplate的getSession方法,但是需要我們對session的生命周期以及關(guān)閉作仔細(xì)的控制,具體的控制策略可以參考spring地實現(xiàn)。




          posted on 2005-05-31 09:16 笨笨 閱讀(919) 評論(0)  編輯  收藏 所屬分類: J2EEHibernateAndSpringALL
          主站蜘蛛池模板: 遵化市| 封丘县| 南汇区| 青海省| 阆中市| 古丈县| 双牌县| 静宁县| 凌海市| 博罗县| 瑞金市| 龙州县| 荣昌县| 黔西县| 宣汉县| 东兴市| 玉山县| 秭归县| 贵溪市| 双城市| 兰州市| 清远市| 屏南县| 青田县| 手游| 绵竹市| 新郑市| 锡林郭勒盟| 镇江市| 西畴县| 四川省| 阜阳市| 揭西县| 秦皇岛市| 楚雄市| 闵行区| 江都市| 梁山县| 阳山县| 老河口市| 海南省|