• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Hibernate Iterator JCS分析

    發布: 2007-6-06 17:31 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 71次 | 進入軟件測試論壇討論

    領測軟件測試網
    JCS是一個對象Cache,它可以把Java對象緩存起來,提高那些訪問頻率很高的Java對象的存取效率。JCS是按照對象的唯一標示來存取對象的,比如說可以按照對象的hashCode來存取。

    對于Hibernate來說,可以利用JCS來緩存查詢結果,這樣當下次訪問同樣的數據,就無須去數據庫取,直接從JCS中取出來,加快了查詢速度。

    當Hibernate使用List或者Iterator方式來第一次讀取數據的時候,JCS是空的,此時不管是List方式還是Iterator方式都會往JCS里面填充查詢出來的持久對象,例如:

    select c from Cat as c



    select c.id, c.name from Cat as c

    這種HQL語句不構造PO,因此不會去填充JCS。

    好了,現在JCS里面填好了數據,但是該怎么取呢?上面我說過是按照對象的唯一標示來存取的,而對于PO持久對象來說,唯一標示就是主鍵,因此Hibernate首先必須獲得主鍵列表,然后根據主鍵列表挨個判斷,看這個持久對象究竟是在JCS里面還是在數據庫里面,如果在JCS里面,那么按照主鍵取,如果在數據庫,那么發送sql取。

    現在我們來分析為什么Iterator可以使用JCS,而List不能。上面說了,用JCS之前,要先獲得持久對象的主鍵,才能去JCS里面取持久對象,而我們怎么才能獲得主鍵列表呢?必須去數據庫中取得,這一步是沒有辦法緩沖的。

    Hibernate Iterator的查詢本身是分為兩步的:

    ==> select id from cat
    ==> select * from cat where id = ?
    ==> select * from cat where id = ?
    ...
    ==> select * from cat where id = ?

    第一步,去數據庫中取主鍵列表,第二步,按照主鍵一個一個取數據。當然了,我們現在可以看出來,Iterator方式下如果不用JCS的話,那么從數據庫中取出n條記錄就需要n+1次sql查詢,這是非?膳碌氖虑,因此如果在沒有使用JCS的情況下,你又必須一次去取大量數據,應該避免使用Iterator。

    而Iterator的第一次sql是取主鍵列表,這個時間消耗是非常少的,如果使用了JCS,那么每次查詢仍然要不可避免的去發送一次sql: select id from cat 去取主鍵列表,然后呢? 然后Iterator就不會那么傻了,他會先到JCS里面去看看,按照主鍵去找持久對象,如果有了,直接拿出來用,如果沒有,那么只好去數據庫中取得,然后再把它填到JCS里面去。

    因此可以看出來,JCS有點類似一個內存中的簡單對象數據庫, Iterator的第一次sql取主鍵列表是必須要到數據庫里面取的,取得了主鍵這把鑰匙以后,Iterator會首先嘗試開JCS這把鎖,打得開就直接進去,如果打不開,就只好去開數據庫這把鎖了。

    而Hibernate List方式是JDBC的簡單封裝,一次sql就把所有的數據都取出來了,它不會像Iterator那樣先取主鍵,然后再取數據,因此List無法利用JCS。不過List也可以把從數據庫中取出的數據填充到JCS里面去。

    最佳的方式:第一次訪問使用List,快速填充JCS,以后訪問采用Iterator,充分利用JCS。

    mikeho write:

    那JCS是如何和Database保持同步的?

    robbin write:

    jcs.default.elementattributes.MaxLifeSeconds=240(最大緩沖時間)

    超時做作廢,另外你在程序里面也可以clear JCS cache

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: hibernate iterator jcs分析


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>