




已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
JavaEE課程傳智播客 java學(xué)院 傳智.燕青mybatis第二天 高級映射 查詢緩存 和spring整合課程復(fù)習(xí):mybatis是什么?mybatis是一人持久層框架,mybatis是一個不完全的ORM框架。sql語句需要程序員自己去編寫,但是mybatis也有映射(輸入?yún)?shù)映射、輸出結(jié)果映射)。mybatis入門門檻不高,學(xué)習(xí)成本低,讓程序員把精力放在sql語句上,對sql語句優(yōu)化非常方便,適用與需求變化較多項目,比如互聯(lián)網(wǎng)項目。mybatis框架執(zhí)行過程:1、配置mybatis的配置文件,SqlMapConfig.xml(名稱不固定)2、通過配置文件,加載mybatis運(yùn)行環(huán)境,創(chuàng)建SqlSessionFactory會話工廠SqlSessionFactory在實際使用時按單例方式。3、通過SqlSessionFactory創(chuàng)建SqlSessionSqlSession是一個面向用戶接口(提供操作數(shù)據(jù)庫方法),實現(xiàn)對象是線程不安全的,建議sqlSession應(yīng)用場合在方法體內(nèi)。4、調(diào)用sqlSession的方法去操作數(shù)據(jù)。如果需要提交事務(wù),需要執(zhí)行SqlSession的commit()方法。5、釋放資源,關(guān)閉SqlSessionmybatis開發(fā)dao的方法:1、原始dao 的方法需要程序員編寫dao接口和實現(xiàn)類需要在dao實現(xiàn)類中注入一個SqlSessionFactory工廠。2、mapper代理開發(fā)方法(建議使用)只需要程序員編寫mapper接口(就是dao接口)程序員在編寫mapper.xml(映射文件)和mapper.java需要遵循一個開發(fā)規(guī)范:1、mapper.xml中namespace就是mapper.java的類全路徑。2、mapper.xml中statement的id和mapper.java中方法名一致。3、mapper.xml中statement的parameterType指定輸入?yún)?shù)的類型和mapper.java的方法輸入 參數(shù)類型一致。4、mapper.xml中statement的resultType指定輸出結(jié)果的類型和mapper.java的方法返回值類型一致。SqlMapConfig.xml配置文件:可以配置properties屬性、別名、mapper加載。輸入映射:parameterType:指定輸入?yún)?shù)類型可以簡單類型、pojo、hashmap。對于綜合查詢,建議parameterType使用包裝的pojo,有利于系統(tǒng) 擴(kuò)展。輸出映射:resultType:查詢到的列名和resultType指定的pojo的屬性名一致,才能映射成功。reusltMap:可以通過resultMap 完成一些高級映射。如果查詢到的列名和映射的pojo的屬性名不一致時,通過resultMap設(shè)置列名和屬性名之間的對應(yīng)關(guān)系(映射關(guān)系)??梢酝瓿捎成?。高級映射:將關(guān)聯(lián)查詢的列映射到一個pojo屬性中。(一對一)將關(guān)聯(lián)查詢的列映射到一個List中。(一對多)動態(tài)sql:(重點)if判斷(掌握)whereforeachsql片段(掌握)課程安排:對訂單商品數(shù)據(jù)模型進(jìn)行分析。高級映射:(了解)實現(xiàn)一對一查詢、一對多、多對多查詢。延遲加載查詢緩存一級緩存二級緩存(了解mybatis二級緩存使用場景)mybatis和spirng整合(掌握)逆向工程(會用)1 訂單商品數(shù)據(jù)模型1.1 數(shù)據(jù)模型分析思路1、每張表記錄的數(shù)據(jù)內(nèi)容分模塊對每張表記錄的內(nèi)容進(jìn)行熟悉,相當(dāng) 于你學(xué)習(xí)系統(tǒng) 需求(功能)的過程。2、每張表重要的字段設(shè)置非空字段、外鍵字段3、數(shù)據(jù)庫級別表與表之間的關(guān)系外鍵關(guān)系4、表與表之間的業(yè)務(wù)關(guān)系在分析表與表之間的業(yè)務(wù)關(guān)系時一定要建立 在某個業(yè)務(wù)意義基礎(chǔ)上去分析。1.2 數(shù)據(jù)模型分析用戶表:userid:自增主鍵訂單表:ordersnumber:訂單號user_id(外鍵,用戶id)訂單明細(xì)表:orderdetailorders_id(外鍵,訂單id)items_id(外鍵,商品id)商品表:itemsuser_id外鍵orders_id外鍵items_id外鍵一對一一對多一對一一對多一對一一對多orders- items一對多items-orders:一對多總之:orders和items是多對多關(guān)系user和items是多對多關(guān)系用戶表user:記錄了購買商品的用戶信息訂單表:orders記錄了用戶所創(chuàng)建的訂單(購買商品的訂單)訂單明細(xì)表:orderdetail:記錄了訂單的詳細(xì)信息即購買商品的信息商品表:items記錄了商品信息表與表之間的業(yè)務(wù)關(guān)系:在分析表與表之間的業(yè)務(wù)關(guān)系時需要建立 在某個業(yè)務(wù)意義基礎(chǔ)上去分析。先分析數(shù)據(jù)級別之間有關(guān)系的表之間的業(yè)務(wù)關(guān)系:usre和orders:user-orders:一個用戶可以創(chuàng)建多個訂單,一對多orders-user:一個訂單只由一個用戶創(chuàng)建,一對一orders和orderdetail:orders-orderdetail:一個訂單可以包括 多個訂單明細(xì),因為一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關(guān)系orderdetail- orders:一個訂單明細(xì)只能包括在一個訂單中,一對一orderdetail和itesm:orderdetail-itesms:一個訂單明細(xì)只對應(yīng)一個商品信息,一對一items- orderdetail:一個商品可以包括在多個訂單明細(xì) ,一對多再分析數(shù)據(jù)庫級別沒有關(guān)系的表之間是否有業(yè)務(wù)關(guān)系:orders和items:orders和items之間可以通過orderdetail表建立 關(guān)系。2 一對一查詢2.1 需求查詢訂單信息,關(guān)聯(lián)查詢創(chuàng)建訂單的用戶信息2.2 resultType2.2.1 sql語句確定查詢的主表:訂單表確定查詢的關(guān)聯(lián)表:用戶表關(guān)聯(lián)查詢使用內(nèi)鏈接?還是外鏈接?由于orders表中有一個外鍵(user_id),通過外鍵關(guān)聯(lián)查詢用戶表只能查詢出一條記錄,可以使用內(nèi)鏈接。SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id2.2.2 創(chuàng)建pojo將上邊sql查詢的結(jié)果映射到pojo中,pojo中必須包括所有查詢列名。原始的Orders.java不能映射全部字段,需要新創(chuàng)建的pojo。創(chuàng)建 一個pojo繼承包括查詢字段較多的po類。2.2.3 mapper.xml2.2.4 mapper.java2.3 resultMap2.3.1 sql語句同resultType實現(xiàn)的sql2.3.2 使用resultMap映射的思路使用resultMap將查詢結(jié)果中的訂單信息映射到Orders對象中,在orders類中添加User屬性,將關(guān)聯(lián)查詢出來的用戶信息映射到orders對象中的user屬性中。2.3.3 需要Orders類中添加user屬性2.3.4 mapper.xml 定義resultMap statement定義2.3.5 mapper.java2.4 resultType和resultMap實現(xiàn)一對一查詢小結(jié)實現(xiàn)一對一查詢:resultType:使用resultType實現(xiàn)較為簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應(yīng)的屬性,即可完成映射。如果沒有查詢結(jié)果的特殊要求建議使用resultType。resultMap:需要單獨定義resultMap,實現(xiàn)有點麻煩,如果對查詢結(jié)果有特殊的要求,使用resultMap可以完成將關(guān)聯(lián)查詢映射pojo的屬性中。resultMap可以實現(xiàn)延遲加載,resultType無法實現(xiàn)延遲加載。3 一對多查詢3.1 需求查詢訂單及訂單明細(xì)的信息。3.2 sql語句確定主查詢表:訂單表確定關(guān)聯(lián)查詢表:訂單明細(xì)表在一對一查詢基礎(chǔ)上添加訂單明細(xì)表關(guān)聯(lián)即可。SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_idFROM orders, USER, orderdetailWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id3.3 分析使用resultType將上邊的 查詢結(jié)果映射到pojo中,訂單信息的就是重復(fù)。要求:對orders映射不能出現(xiàn)重復(fù)記錄。在orders.java類中添加List orderDetails屬性。最終會將訂單信息映射到orders中,訂單所對應(yīng)的訂單明細(xì)映射到orders中的orderDetails屬性中。映射成的orders記錄數(shù)為兩條(orders信息不重復(fù))每個orders中的orderDetails屬性存儲了該 訂單所對應(yīng)的訂單明細(xì)。3.4 在orders中添加list訂單明細(xì)屬性3.5 mapper.xml3.6 resultMap定義 3.7 mapper.java3.8 小結(jié)mybatis使用resultMap的collection對關(guān)聯(lián)查詢的多條記錄映射到一個list集合屬性中。使用resultType實現(xiàn):將訂單明細(xì)映射到orders中的orderdetails中,需要自己處理,使用雙重循環(huán)遍歷,去掉重復(fù)記錄,將訂單明細(xì)放在orderdetails中。4 多對多查詢4.1 需求查詢用戶及用戶購買商品信息。4.2 sql語句查詢主表是:用戶表關(guān)聯(lián)表:由于用戶和商品沒有直接關(guān)聯(lián),通過訂單和訂單明細(xì)進(jìn)行關(guān)聯(lián),所以關(guān)聯(lián)表:orders、orderdetail、itemsSELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items_name, items.detail items_detail, items.price items_priceFROM orders, USER, orderdetail, itemsWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id4.3 映射思路將用戶信息映射到user中。在user類中添加訂單列表屬性List orderslist,將用戶創(chuàng)建的訂單映射到orderslist在Orders中添加訂單明細(xì)列表屬性Listorderdetials,將訂單的明細(xì)映射到orderdetials在OrderDetail中添加Items屬性,將訂單明細(xì)所對應(yīng)的商品映射到Items4.4 mapper.xml4.5 resultMap定義 4.6 mapper.java4.7 多對多查詢總結(jié)將查詢用戶購買的商品信息明細(xì)清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數(shù)量)針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴(kuò)展的pojo中,很簡單實現(xiàn)明細(xì)清單的功能。一對多是多對多的特例,如下需求:查詢用戶購買的商品信息,用戶和商品的關(guān)系是多對多關(guān)系。需求1:查詢字段:用戶賬號、用戶名稱、用戶性別、商品名稱、商品價格(最常見)企業(yè)開發(fā)中常見明細(xì)列表,用戶購買商品明細(xì)列表,使用resultType將上邊查詢列映射到pojo輸出。需求2:查詢字段:用戶賬號、用戶名稱、購買商品數(shù)量、商品明細(xì)(鼠標(biāo)移上顯示明細(xì))使用resultMap將用戶購買的商品明細(xì)列表映射到user對象中??偨Y(jié):使用resultMap是針對那些對查詢結(jié)果映射有特殊要求的功能,比如特殊要求映射成list中包括 多個list。5 resultMap總結(jié)resultType:作用:將查詢結(jié)果按照sql列名pojo屬性名一致性映射到pojo中。場合:常見一些明細(xì)記錄的展示,比如用戶購買商品明細(xì),將關(guān)聯(lián)查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。resultMap:使用association和collection完成一對一和一對多高級映射(對結(jié)果有特殊的映射要求)。association:作用:將關(guān)聯(lián)查詢信息映射到一個pojo對象中。場合:為了方便查詢關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關(guān)聯(lián)用戶信息。使用resultType無法將查詢結(jié)果映射到pojo對象的pojo屬性中,根據(jù)對結(jié)果集查詢遍歷的需要選擇使用resultType還是resultMap。collection:作用:將關(guān)聯(lián)查詢信息映射到一個list集合中。場合:為了方便查詢遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢用戶權(quán)限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結(jié)果集進(jìn)行遍歷查詢。如果使用resultType無法將查詢結(jié)果映射到list集合中。6 延遲加載6.1 什么是延遲加載resultMap可以實現(xiàn)高級映射(使用association、collection實現(xiàn)一對一及一對多映射),association、collection具備延遲加載功能。需求:如果查詢訂單并且關(guān)聯(lián)查詢用戶信息。如果先查詢訂單信息即可滿足要求,當(dāng)我們需要查詢用戶信息時再查詢用戶信息。把對用戶信息的按需去查詢就是延遲加載。延遲加載:先從單表查詢、需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢,大大提高 數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快。6.2 使用association實現(xiàn)延遲加載6.2.1 需求查詢訂單并且關(guān)聯(lián)查詢用戶信息6.2.2 mapper.xml需要定義兩個mapper的方法對應(yīng)的statement。1、只查詢訂單信息SELECT * FROM orders在查詢訂單的statement中使用association去延遲加載(執(zhí)行)下邊的satatement(關(guān)聯(lián)查詢用戶信息)2、關(guān)聯(lián)查詢用戶信息通過上邊查詢到的訂單信息中user_id去關(guān)聯(lián)查詢用戶信息使用UserMapper.xml中的findUserById上邊先去執(zhí)行findOrdersUserLazyLoading,當(dāng)需要去查詢用戶的時候再去執(zhí)行findUserById,通過resultMap的定義將延遲加載執(zhí)行配置起來。6.2.3 延遲加載resultMap使用association中的select指定延遲加載去執(zhí)行的statement的id。6.2.4 mapper.java6.2.5 測試 測試思路:1、執(zhí)行上邊mapper方法(findOrdersUserLazyLoading),內(nèi)部去調(diào)用cn.itcast.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查詢orders信息(單表)。2、在程序中去遍歷上一步驟查詢出的List,當(dāng)我們調(diào)用Orders中的getUser方法時,開始進(jìn)行延遲加載。3、延遲加載,去調(diào)用UserMapper.xml中findUserbyId這個方法獲取用戶信息。 延遲加載配置mybatis默認(rèn)沒有開啟延遲加載,需要在SqlMapConfig.xml中setting配置。在mybatis核心配置文件中配置:lazyLoadingEnabled、aggressiveLazyLoading設(shè)置項描述允許值默認(rèn)值lazyLoadingEnabled全局性設(shè)置懶加載。如果設(shè)為false,則所有相關(guān)聯(lián)的都會被初始化加載。true | falsefalseaggressiveLazyLoading當(dāng)設(shè)置為true的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。true | falsetrue在SqlMapConfig.xml中配置: 測試代碼6.2.6 延遲加載思考不使用mybatis提供的association及collection中的延遲加載功能,如何實現(xiàn)延遲加載?實現(xiàn)方法如下:定義兩個mapper方法:1、查詢訂單列表2、根據(jù)用戶id查詢用戶信息實現(xiàn)思路:先去查詢第一個mapper方法,獲取訂單信息列表在程序中(service),按需去調(diào)用第二個mapper方法去查詢用戶信息??傊菏褂醚舆t加載方法,先去查詢簡單的sql(最好單表,也可以關(guān)聯(lián)查詢),再去按需要加載關(guān)聯(lián)查詢的其它信息。7 查詢緩存7.1 什么是查詢緩存mybatis提供查詢緩存,用于減輕數(shù)據(jù)壓力,提高數(shù)據(jù)庫性能。mybaits提供一級緩存,和二級緩存。一級緩存是SqlSession級別的緩存。在操作數(shù)據(jù)庫時需要構(gòu)造 sqlSession對象,在對象中有一個數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。為什么要用緩存?如果緩存中有數(shù)據(jù)就不用從數(shù)據(jù)庫中獲取,大大提高系統(tǒng)性能。7.2 一級緩存7.2.1 一級緩存工作原理第一次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數(shù)據(jù)庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。如果sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。第二次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。7.2.2 一級緩存測試mybatis默認(rèn)支持一級緩存,不需要在配置文件去配置。按照上邊一級緩存原理步驟去測試。Testpublic void testCache1() throws ExceptionSqlSession sqlSession = sqlSessionFactory.openSession();/創(chuàng)建代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);/下邊查詢使用一個SqlSession/第一次發(fā)起請求,查詢id為1的用戶User user1 = userMapper.findUserById(1);System.out.println(user1);/如果sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。/更新user1的信息user1.setUsername(測試用戶22);userMapper.updateUser(user1);/執(zhí)行commit操作去清空緩存sqlSmit();/第二次發(fā)起請求,查詢id為1的用戶User user2 = userMapper.findUserById(1);System.out.println(user2);sqlSession.close();7.2.3 一級緩存應(yīng)用正式開發(fā),是將mybatis和spring進(jìn)行整合開發(fā),事務(wù)控制在service中。一個service方法中包括 很多mapper方法調(diào)用。service/開始執(zhí)行時,開啟事務(wù),創(chuàng)建SqlSession對象/第一次調(diào)用mapper的方法findUserById(1)/第二次調(diào)用mapper的方法findUserById(1),從一級緩存中取數(shù)據(jù)/方法結(jié)束,sqlSession關(guān)閉如果是執(zhí)行兩次service調(diào)用查詢相同 的用戶信息,不走一級緩存,因為session方法結(jié)束,sqlSession就關(guān)閉,一級緩存就清空。7.3 二級緩存7.3.1 原理首先開啟mybatis的二級緩存。sqlSession1去查詢用戶id為1的用戶信息,查詢到用戶信息會將查詢數(shù)據(jù)存儲到二級緩存中。如果SqlSession3去執(zhí)行相同 mapper下sql,執(zhí)行commit提交,清空該 mapper下的二級緩存區(qū)域的數(shù)據(jù)。sqlSession2去查詢用戶id為1的用戶信息,去緩存中找是否存在數(shù)據(jù),如果存在直接從緩存中取出數(shù)據(jù)。二級緩存與一級緩存區(qū)別,二級緩存的范圍更大,多個sqlSession可以共享一個UserMapper的二級緩存區(qū)域。UserMapper有一個二級緩存區(qū)域(按namespace分) ,其它mapper也有自己的二級緩存區(qū)域(按namespace分)。每一個namespace的mapper都有一個二緩存區(qū)域,兩個mapper的namespace如果相同,這兩個mapper執(zhí)行sql查詢到數(shù)據(jù)將存在相同 的二級緩存區(qū)域中。7.3.2 開啟二級緩存mybaits的二級緩存是mapper范圍級別,除了在SqlMapConfig.xml設(shè)置二級緩存的總開關(guān),還要在具體的mapper.xml中開啟二級緩存。在核心配置文件SqlMapConfig.xml中加入描述允許值默認(rèn)值cacheEnabled對在此配置文件下的所有cache 進(jìn)行全局性開/關(guān)設(shè)置。true falsetrue在UserMapper.xml中開啟二緩存,UserMapper.xml下的sql執(zhí)行完成會存儲到它的緩存區(qū)域(HashMap)。7.3.3 調(diào)用pojo類實現(xiàn)序列化接口為了將緩存數(shù)據(jù)取出執(zhí)行反序列化操作,因為二級緩存數(shù)據(jù)存儲介質(zhì)多種多樣,不一樣在內(nèi)存。7.3.4 測試方法/ 二級緩存測試Testpublic void testCache2() throws Exception SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();SqlSession sqlSession3 = sqlSessionFactory.openSession();/ 創(chuàng)建代理對象UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);/ 第一次發(fā)起請求,查詢id為1的用戶User user1 = userMapper1.findUserById(1);System.out.println(user1);/這里執(zhí)行關(guān)閉操作,將sqlsession中的數(shù)據(jù)寫到二級緩存區(qū)域sqlSession1.close();/使用sqlSession3執(zhí)行commit()操作UserMapper userMapper3 = sqlSession3.getMapper(UserMapper.class);User user = userMapper3.findUserById(1);user.setUsername(張明明);userMapper3.updateUser(user);/執(zhí)行提交,清空UserMapper下邊的二級緩存sqlSmit();sqlSession3.close();UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);/ 第二次發(fā)起請求,查詢id為1的用戶User user2 = userMapper2.findUserById(1);System.out.println(user2);sqlSession2.close();7.3.5 useCache配置在statement中設(shè)置useCache=false可以禁用當(dāng)前select語句的二級緩存,即每次查詢都會發(fā)出sql去查詢,默認(rèn)情況是true,即該sql使用二級緩存??偨Y(jié):針對每次查詢都需要最新的數(shù)據(jù)sql,要設(shè)置成useCache=false,禁用二級緩存。7.3.6 刷新緩存(就是清空緩存)在mapper的同一個namespace中,如果有其它insert、update、delete操作數(shù)據(jù)后需要刷新緩存,如果不執(zhí)行刷新緩存會出現(xiàn)臟讀。設(shè)置statement配置中的flushCache=true屬性,默認(rèn)情況下為true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數(shù)據(jù)庫表中的查詢數(shù)據(jù)會出現(xiàn)臟讀。如下:總結(jié):一般下執(zhí)行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數(shù)據(jù)庫臟讀。7.4 mybatis整合ehcacheehcache是一個分布式緩存框架。7.4.1 分布緩存我們系統(tǒng)為了提高系統(tǒng)并發(fā),性能、一般對系統(tǒng)進(jìn)行分布式部署(集群部署方式)系統(tǒng)工程springmvcmybatis服務(wù)器1系統(tǒng)工程springmvcmybatis服務(wù)器2對緩存數(shù)據(jù)進(jìn)行集中管理(redis集群)使用分布式緩存框架redis、memcached、ehcache。不使用分布緩存,緩存的數(shù)據(jù)在各各服務(wù)單獨存儲,不方便系統(tǒng) 開發(fā)。所以要使用分布式緩存對緩存數(shù)據(jù)進(jìn)行集中管理。mybatis無法實現(xiàn)分布式緩存,需要和其它分布式緩存框架進(jìn)行整合。7.4.2 整合方法(掌握)mybatis提供了一個cache接口,如果要實現(xiàn)自己的緩存邏輯,實現(xiàn)cache接口開發(fā)即可。mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache接口的實現(xiàn)類。mybatis默認(rèn)實現(xiàn)cache類是:7.4.3 加入ehcache包7.4.4 整合ehcache配置mapper中cache中的type為ehcache對cache接口的實現(xiàn)類型。7.4.5 加入ehcache的配置文件在classpath下配置ehcache.xml7.5 二級應(yīng)用場景對于訪問多的查詢請求且用戶對查詢結(jié)果實時性要求不高,此時可采用mybatis二級緩存技術(shù)降低數(shù)據(jù)庫訪問量,提高訪問速度,業(yè)務(wù)場景比如:耗時較高的統(tǒng)計分析sql、電話賬單查詢sql等。實現(xiàn)方法如下:通過設(shè)置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據(jù)數(shù)據(jù)變化頻率設(shè)置緩存刷新間隔flushInterval,比如設(shè)置為30分鐘、60分鐘、24小時等,根據(jù)需求而定。7.6 二級緩存局限性mybatis二級緩存對細(xì)粒度的數(shù)據(jù)級別的緩存實現(xiàn)不好,比如如下需求:對商品信息進(jìn)行緩存,由于商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 景區(qū)監(jiān)控布點方案
- 大書店開業(yè)活動方案
- 財務(wù)總監(jiān)負(fù)責(zé)下的財務(wù)報表編制與分析聘用合同
- 農(nóng)場水災(zāi)處理措施方案
- 企業(yè)商標(biāo)保護(hù)課件的意義
- 票據(jù)掃描面試題及答案
- 校醫(yī)防疫面試題及答案
- 2026版《全品高考》選考復(fù)習(xí)方案生物0502 第14講 第2課時 基因分離定律的拓展應(yīng)用含答案
- 移動升降車安全操作規(guī)程培訓(xùn)
- 口腔正畸模型測量分析
- 2025年全科醫(yī)生考試試題及答案詳細(xì)解析
- 2025年蘇州市中考物理試卷真題(含答案)
- DLT5210.1-2021電力建設(shè)施工質(zhì)量驗收規(guī)程第1部分-土建工程
- 鄉(xiāng)鎮(zhèn)建材活動方案
- 2025年中醫(yī)護(hù)理技術(shù)理論考試試題(附答案)
- T/SHPTA 069-2023汽車內(nèi)飾用反應(yīng)型聚氨酯熱熔膠
- 2025小升初人教版六年級英語下學(xué)期期末綜合測試模擬練習(xí)卷
- 自用貨架出售合同協(xié)議
- 鋼結(jié)構(gòu)工程的質(zhì)量保障與售后服務(wù)措施
- 2025武漢市房屋租賃合同示范文本
評論
0/150
提交評論