精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Hibernate二級緩存攻略

開發 后端
很多人對Hibernate二級緩存都不太了解,或者是有錯誤的認識,本文是一篇介紹Hibernate二級緩存的文章,旨在幫助讀者更好的理解Hibernate二級緩存,糾正錯誤的認識。

很多人對Hibernate二級緩存都不太了解,或者是有錯誤的認識,我一直想寫一篇文章介紹一下Hibernate二級緩存的,今天終于忍不住了。我的經驗主要來自Hibernate2.1版本,基本原理和3.0、3.1是一樣的,請原諒我的頑固不化。

Hibernate的session提供了一級緩存,每個session,對同一個id進行兩次load,不會發送兩條sql給數據庫,但是session關閉的時候,一級緩存就失效了。Hibernate二級緩存是SessionFactory級別的全局緩存,它底下可以使用不同的緩存類庫,比如ehcache、oscache等,需要設置Hibernate.cache.provider_class,我們這里用ehcache,在2.1中就是Hibernate.cache.provider_class=net.sf.Hibernate.cache.EhCacheProvider如果使用查詢緩存,加上Hibernate.cache.use_query_cache=true。緩存可以簡單的看成一個Map,通過key在緩存里面找value。

Class的緩存
 
對于一條記錄,也就是一個PO來說,是根據ID來找的,緩存的key就是ID,value是POJO。無論list,load還是 iterate,只要讀出一個對象,都會填充緩存。但是list不會使用緩存,而iterate會先取數據庫select id出來,然后一個id一個id的load,如果在緩存里面有,就從緩存取,沒有的話就去數據庫load。假設是讀寫緩存,需要設置:<cache usage="read-write"/>如果你使用的二級緩存實現是ehcache的話,需要配置

  1. ehcache.xml < 
  2. cache name="com.xxx.pojo.Foo"   
  3. maxElementsInMemory="500" eternal="false"   
  4. timeToLiveSeconds="7200"   
  5. timeToIdleSeconds="3600"   
  6. overflowToDisk="true" />  

其中eternal表示緩存是不是永遠不超時,timeToLiveSeconds是緩存中每個元素(這里也就是一個POJO)的超時時間,如果eternal="false",超過指定的時間,這個元素就被移走了。timeToIdleSeconds是發呆時間,是可選的。當往緩存里面put 的元素超過500個時,如果overflowToDisk="true",就會把緩存中的部分數據保存在硬盤上的臨時文件里面。
 
每個需要緩存的class都要這樣配置。如果你沒有配置,Hibernate會在啟動的時候警告你,然后使用defaultCache的配置,這樣多個class會共享一個配置。

當某個ID通過Hibernate修改時,Hibernate會知道,于是移除緩存。這樣大家可能會想,同樣的查詢條件,第一次先list,第二次再iterate,就可以使用到緩存了。實際上這是很難的,因為你無法判斷什么時候是第一次,而且每次查詢的條件通常是不一樣的,假如數據庫里面有100條記錄,id從1到100,第一次list的時候出了前50個id,第二次 iterate的時候卻查詢到30至70號id,那么30-50是從緩存里面取的,51到70是從數據庫取的,共發送1+20條sql。所以我一直認為 iterate沒有什么用,總是會有1+N的問題。(題外話:有說法說大型查詢用list會把整個結果集裝入內存,很慢,而iterate只select id比較好,但是大型查詢總是要分頁查的,誰也不會真的把整個結果集裝進來,假如一頁20條的話,iterate共需要執行21條語句,list雖然選擇若干字段,比iterate第一條select id語句慢一些,但只有一條語句,不裝入整個結果集Hibernate還會根據數據庫方言做優化,比如使用mysql的limit,整體看來應該還是 list快。)如果想要對list或者iterate查詢的結果緩存,就要用到查詢緩存了。

查詢緩存
 
首先需要配置Hibernate.cache.use_query_cache=true。如果用ehcache,配置ehcache.xml,注意Hibernate3.0以后不是net.sf的包名了。

  1. <cache name="net.sf.Hibernate.cache.StandardQueryCache"   
  2.   maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"   
  3.   timeToLiveSeconds="7200" overflowToDisk="true"/>   
  4.  <cache name="net.sf.Hibernate.cache.UpdateTimestampsCache"   
  5.   maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>    
  6.  query.setCacheable(true);//激活查詢緩存   
  7.  query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可選   
  8.  第二行指定要使用的cacheRegion是myCacheRegion,
  9. 即你可以給每個查詢緩存做一個單獨的配置,使用setCacheRegion來做這個指定,
  10. 需要在ehcache.xml里面配置它:  
  11.   <cache name="myCacheRegion"   
  12.  maxElementsInMemory="10" eternal="false"   
  13.  timeToIdleSeconds="3600" timeToLiveSeconds="7200" 
  14.  overflowToDisk="true" />  

如果省略第二行,不設置cacheRegion的話,那么會使用上面提到的標準查詢緩存的配置,也就是net.sf.Hibernate.cache.StandardQueryCache

對于查詢緩存來說,緩存的key是根據hql生成的sql,再加上參數,分頁等信息(可以通過日志輸出看到,不過它的輸出不是很可讀,最好改一下它的代碼)。比如hql:from Cat c where c.name like ? 生成大致如下的sql:select * from cat c where c.name like ? 參數是"tiger%",那么查詢緩存的key*大約*是這樣的字符串(我是憑記憶寫的,并不精確,不過看了也該明白了):select * from cat c where c.name like ? , parameter:tiger% 這樣,保證了同樣的查詢、同樣的參數等條件下具有一樣的key。

現在說說緩存的value,如果是list方式的話,value在這里并不是整個結果集,而是查詢出來的這一串ID。也就是說,不管是list方法還是iterate方法,第一次查詢的時候,它們的查詢方式很它們平時的方式是一樣的,list執行一條sql,iterate執行1+N條,多出來的行為是它們填充了緩存。但是到同樣條件第二次查詢的時候,就都和iterate的行為一樣了,根據緩存的key去緩存里面查到了value,value是一串id,然后在到class的緩存里面去一個一個的load出來。這樣做是為了節約內存。

可以看出來,查詢緩存需要打開相關類的class緩存。list和iterate方法第一次執行的時候,都是既填充查詢緩存又填充class緩存的。這里還有一個很容易被忽視的重要問題,即打開查詢緩存以后,即使是list方法也可能遇到1+N的問題!相同條件第一次list的時候,因為查詢緩存中找不到,不管class緩存是否存在數據,總是發送一條sql語句到數據庫獲取全部數據,然后填充查詢緩存和 class緩存。但是第二次執行的時候,問題就來了,如果你的class緩存的超時時間比較短,現在class緩存都超時了,但是查詢緩存還在,那么 list方法在獲取id串以后,將會一個一個去數據庫load!因此,class緩存的超時時間一定不能短于查詢緩存設置的超時時間!如果還設置了發呆時間的話,保證class緩存的發呆時間也大于查詢的緩存的生存時間。這里還有其他情況,比如class緩存被程序強制evict了,這種情況就請自己注意了。

另外,如果hql查詢包含select字句,那么查詢緩存里面的value就是整個結果集了。

當Hibernate更新數據庫的時候,它怎么知道更新哪些查詢緩存呢?Hibernate在一個地方維護每個表的最后更新時間,其實也就是放在上面net.sf.Hibernate.cache.UpdateTimestampsCache所指定的緩存配置里面。

當通過Hibernate更新的時候,Hibernate會知道這次更新影響了哪些表。然后它更新這些表的最后更新時間。每個緩存都有一個生成時間和這個緩存所查詢的表,當Hibernate查詢一個緩存是否存在的時候,如果緩存存在,它還要取出緩存的生成時間和這個緩存所查詢的表,然后去查找這些表的最后更新時間,如果有一個表在生成時間后更新過了,那么這個緩存是無效的。

可以看出,只要更新過一個表,那么凡是涉及到這個表的查詢緩存就失效了,因此查詢緩存的命中率可能會比較低。

Collection緩存
 
需要在hbm的collection里面設置 <cache usage="read-write"/> 假如class是Cat,collection叫children,那么ehcache里面配置

  1. <cache name="com.xxx.pojo.Cat.children"   
  2. maxElementsInMemory="20" eternal="false" 
  3. timeToIdleSeconds="3600" timeToLiveSeconds="7200"   
  4. overflowToDisk="true" />  

Collection的緩存和前面查詢緩存的list一樣,也是只保持一串id,但它不會因為這個表更新過就失效,一個collection緩存僅在這個collection里面的元素有增刪時才失效。

這樣有一個問題,如果你的collection是根據某個字段排序的,當其中一個元素更新了該字段時,導致順序改變時,collection緩存里面的順序沒有做更新。

緩存策略

只讀緩存(read-only):沒有什么好說的。

讀/寫緩存(read-write):程序可能要的更新數據。

不嚴格的讀/寫緩存(nonstrict-read-write):需要更新數據,但是兩個事務更新同一條記錄的可能性很小,性能比讀寫緩存好。

事務緩存(transactional):緩存支持事務,發生異常的時候,緩存也能夠回滾,只支持jta環境,這個我沒有怎么研究過。

讀寫緩存和不嚴格讀寫緩存在實現上的區別在于,讀寫緩存更新緩存的時候會把緩存里面的數據換成一個鎖,其他事務如果去取相應的緩存數據,發現被鎖住了,然后就直接取數據庫查詢。在Hibernate2.1的ehcache實現中,如果鎖住部分緩存的事務發生了異常,那么緩存會一直被鎖住,直到60秒后超時。不嚴格讀寫緩存不鎖定緩存中的數據。


使用二級緩存的前置條件

你的Hibernate程序對數據庫有獨占的寫訪問權,其他的進程更新了數據庫,Hibernate是不可能知道的。你操作數據庫必需直接通過 Hibernate,如果你調用存儲過程,或者自己使用jdbc更新數據庫,Hibernate也是不知道的。Hibernate3.0的大批量更新和刪除是不更新二級緩存的,但是據說3.1已經解決了這個問題。這個限制相當的棘手,有時候Hibernate做批量更新、刪除很慢,但是你卻不能自己寫jdbc來優化,很郁悶吧。
 
SessionFactory也提供了移除緩存的方法,你一定要自己寫一些JDBC的話,可以調用這些方法移除緩存,這些方法是:

  1. void evict(Class persistentClass)   
  2.           Evict all entries from the second-level cache.   
  3. void evict(Class persistentClass, Serializable id)   
  4.           Evict an entry from the second-level cache.   
  5. void evictCollection(String roleName)   
  6.           Evict all entries from the second-level cache.   
  7. void evictCollection(String roleName, Serializable id)   
  8.           Evict an entry from the second-level cache.   
  9. void evictQueries()   
  10.           Evict any query result sets cached in the default query cache region.   
  11. void evictQueries(String cacheRegion)   
  12.           Evict any query result sets cached in the named query cache region.  

不過我不建議這樣做,因為這樣很難維護。比如你現在用JDBC批量更新了某個表,有3個查詢緩存會用到這個表,用 evictQueries(String cacheRegion)移除了3個查詢緩存,然后用evict(Class persistentClass)移除了class緩存,看上去好像完整了。不過哪天你添加了一個相關查詢緩存,可能會忘記更新這里的移除代碼。如果你的 jdbc代碼到處都是,在你添加一個查詢緩存的時候,還知道其他什么地方也要做相應的改動嗎?

總結

不要想當然的以為緩存一定能提高性能,僅僅在你能夠駕馭它并且條件合適的情況下才是這樣的。Hibernate的二級緩存限制還是比較多的,不方便用jdbc可能會大大的降低更新性能。在不了解原理的情況下亂用,可能會有1+N的問題。不當的使用還可能導致讀出臟數據。
如果受不了Hibernate的諸多限制,那么還是自己在應用程序的層面上做緩存吧。
在越高的層面上做緩存,效果就會越好。就好像盡管磁盤有緩存,數據庫還是要實現自己的緩存,盡管數據庫有緩存,咱們的應用程序還是要做緩存。因為底層的緩存它并不知道高層要用這些數據干什么,只能做的比較通用,而高層可以有針對性的實現緩存,所以在更高的級別上做緩存,效果也要好些吧。

 


 

【編輯推薦】

  1. 初學者適用的Hibernate學習方法
  2. Hibernate實戰(第2版)讀書筆記
  3. Hibernate一對多關系的處理
  4. 十五道Hibernate面試題及答案
  5. Hibernate的性能優化
責任編輯:仲衡 來源: CSDN博客
相關推薦

2009-09-21 14:59:31

Hibernate二級

2009-09-24 11:04:56

Hibernate二級

2009-09-21 14:39:40

Hibernate二級

2009-09-21 13:31:10

Hibernate 3

2009-09-23 09:37:07

Hibernate緩存

2009-06-10 15:00:58

Hibernate二級配置

2013-09-08 23:30:56

EF Code Fir架構設計MVC架構設計

2009-08-13 18:12:12

Hibernate 3

2025-04-29 07:06:20

2009-09-21 17:17:11

Hibernate二級

2024-12-03 14:38:07

CaffeineRedis二級緩存

2022-12-02 12:01:30

Spring緩存生命周期

2022-03-01 18:03:06

Spring緩存循環依賴

2022-01-12 07:48:19

緩存Spring 循環

2015-06-11 10:12:26

Android圖片加載緩存

2025-06-26 01:55:00

2012-02-08 11:01:53

HibernateJava

2009-09-22 11:24:07

Hibernate查詢

2009-06-18 14:51:12

Hibernate緩存Hibernate

2023-04-27 08:18:10

MyBatis緩存存儲
點贊
收藏

51CTO技術棧公眾號

精品在线观看一区二区| 国产一区二区久久精品| r级无码视频在线观看| 亚洲奶汁xxxx哺乳期| 在线综合欧美| 亚洲欧美精品中文字幕在线| 17c国产在线| 国产一二在线播放| 欧美韩日一区二区三区四区| 91传媒视频免费| 在线免费黄色av| 欧美va亚洲va日韩∨a综合色| 亚洲精品97久久| 能在线观看的av| 成人高清免费在线| 国产精品白丝一区二区三区| 黑丝美女久久久| wwwxx欧美| 波多野结衣视频在线观看| 在线观看免费一区二区| 亚洲欧洲在线免费| 亚洲911精品成人18网站| 成人直播视频| 亚洲一区二区在线播放相泽| 日韩一区不卡| 午夜美女福利视频| 蜜桃视频第一区免费观看| 久久久久久久香蕉网| 精品国产国产综合精品| 久久不见久久见中文字幕免费| 一区二区三区在线观看网站| 日本成人三级| 国产精品乱码一区二区视频| 欧美涩涩视频| 久久久电影免费观看完整版| 欧美做受xxxxxⅹ性视频| 日韩一二三区| 91精品欧美一区二区三区综合在| 欧美 国产 小说 另类| 日本五码在线| av在线综合网| 超碰在线97av| 国产黄色一区二区| 狠狠色狠狠色综合| 国产日韩欧美黄色| 亚洲国产av一区二区三区| av成人黄色| 国产69精品久久久久99| 久久久久99精品成人片毛片| 亚洲国产精品日韩专区av有中文| x99av成人免费| 懂色av蜜臀av粉嫩av永久| 成人vr资源| 欧美一区二区三区性视频| 国产91色在线观看| 国产激情欧美| 欧美色视频在线| 天天想你在线观看完整版电影免费| 成人免费在线观看| 欧美激情一区不卡| 亚洲免费视频一区| 自拍视频在线网| 中文字幕中文乱码欧美一区二区| 亚洲精品人成| 国产网站在线免费观看| 日韩理论片一区二区| 影音先锋欧美资源| 91精选在线| 亚洲曰韩产成在线| 人妻少妇精品久久| 深夜av在线| 色久综合一二码| 欧美大尺度做爰床戏| 亚洲日本中文| 欧美日韩人人澡狠狠躁视频| www.浪潮av.com| 成人黄色免费短视频| 欧美亚洲综合另类| 天天干天天色天天干| 亚洲国产aⅴ精品一区二区| 亚洲精品在线观看网站| 国产精品1000部啪视频| 精品国产乱码久久久| 久久精品99久久久久久久久 | 97久久综合区小说区图片区| 精品免费99久久| 青青草原av在线播放| 香蕉久久免费电影| 在线电影院国产精品| 久久综合色视频| 东京一区二区| 7777女厕盗摄久久久| 国产日韩视频一区| 欧美色蜜桃97| 欧美裸身视频免费观看| 亚洲精品视频在线观看免费视频| 天堂va蜜桃一区二区三区漫画版| 成人xxxxx| 神马午夜精品95| 欧美国产亚洲另类动漫| 国产成人亚洲综合无码| 另类图片综合电影| 欧美一区二区精品| 高潮毛片无遮挡| 中文不卡在线| 国产精品69久久| 亚洲黄色小说网| 亚洲国产成人在线| 阿v天堂2018| 亚洲午夜国产成人| 亚洲美腿欧美激情另类| 欧美又粗又大又长| 日本v片在线高清不卡在线观看| 亚洲自拍偷拍网址| av在线免费一区| 岛国av在线不卡| 操人视频免费看| 成人看的羞羞网站| 欧美一级黄色网| www香蕉视频| 国产精品久久久久精k8| 极品美女扒开粉嫩小泬| 少妇高潮一区二区三区99| 亚洲精品一区二区三区不| 九九九在线视频| 精品一区二区三区香蕉蜜桃 | 成年人视频网站免费| 日韩和的一区二在线| 亚洲精品在线网站| 一区二区在线观看免费视频| 青椒成人免费视频| 日韩精品伦理第一区| 国产盗摄——sm在线视频| 日韩女同互慰一区二区| 欧美另类videoxo高潮| 日韩高清在线一区| 日本欧洲国产一区二区| 性欧美又大又长又硬| 欧美va日韩va| 青青草激情视频| 国产精品正在播放| 亚洲一区二区免费| 求av网址在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品久久无码| 日韩视频精品在线观看| 国产精品三区四区| 男人的天堂在线免费视频| 亚洲国产成人在线| 成人亚洲视频在线观看| 亚洲瘦老头同性70tv| 97在线免费观看| 少妇无码一区二区三区| 精品福利在线观看| 国产特级黄色录像| 天堂一区二区在线| 亚洲精品一区国产精品| 国产一区二区三区四区五区3d| 国产亚洲精品美女| 久久久久精彩视频| 中文字幕精品一区| 午夜视频在线网站| 欧美激情综合色综合啪啪| 亚洲一区二区三区成人在线视频精品 | 美女扒开大腿让男人桶| 澳门成人av| 欧美亚洲日本黄色| 91精品专区| 欧美一区二区视频观看视频| 久久久久无码国产精品不卡| 不卡的av在线| 国产欧美高清在线| 国产精品成人3p一区二区三区| zzijzzij亚洲日本成熟少妇| av一级黄色片| 黄网站色欧美视频| 丰满的亚洲女人毛茸茸| 经典三级在线一区| 真人抽搐一进一出视频| 香蕉视频一区| 成人观看高清在线观看免费| 免费男女羞羞的视频网站在线观看| 亚洲成人av中文字幕| 懂色av中文字幕| 亚洲男女毛片无遮挡| 波多野结衣视频播放| 99热精品久久| 国产精品久久久久久久久久久久午夜片 | 中文字幕av不卡| 成人一区二区三区仙踪林| 亚洲欧美日韩国产综合精品二区 | 亚洲japanese制服美女| 黄色在线网站噜噜噜| 久久精品国产亚洲精品| 婷婷五月综合激情| 欧美性色欧美a在线播放| 国产盗摄一区二区三区在线| 2020国产精品久久精品美国| 日韩精品免费一区| 妖精一区二区三区精品视频 | 国产精品久久久久久一区二区三区| 少妇献身老头系列| 欧美a一区二区| 精品国产一区二区三区无码| 久久人人99| 精品视频一区在线| 久久久久久亚洲精品美女| 欧美做受高潮1| 天堂av最新在线| 中文字幕久热精品视频在线| 日韩在线观看视频一区| 一区二区三区精品视频在线| 成人黄色免费网址| 成人在线一区二区三区| 亚洲怡红院在线| 天堂蜜桃91精品| 一区二区传媒有限公司| 欧美国产三级| 综合一区中文字幕| 国产一区二区欧美| 久久免费视频1| 高清日韩欧美| 国产传媒一区| 欧美一级片网址| 国产欧美日韩高清| 中文字幕日本一区二区| 中日韩午夜理伦电影免费| 色一情一乱一区二区三区| 69堂亚洲精品首页| 中文字幕一区二区三区四区免费看 | 亚洲色图自拍| 国产欧美日韩精品一区二区三区 | 欧美激情免费| 夜夜嗨av一区二区三区四区| 欧美捆绑视频| 日韩成人中文字幕| 天堂网av2014| 亚洲第一视频网站| 丰满少妇一级片| 欧美电影免费提供在线观看| a级片在线视频| 欧美一二三区在线观看| 国产黄色av网站| 日韩精品中文字幕一区二区三区| 国产黄色片免费观看| 日韩午夜精品视频| 国产999精品久久久影片官网| 中文在线字幕免费观| 在线欧美小视频| 97人妻精品视频一区| 欧洲视频一区二区| av手机天堂网| 欧美精三区欧美精三区| 国产乱码一区二区| 欧美一卡二卡在线| 丰满少妇在线观看bd| 亚洲国产精品99久久| 亚洲色欧美另类| 亚洲欧美一区二区三区四区| 国产51人人成人人人人爽色哟哟| 国产一区二区三区在线观看网站| 国产毛片av在线| 自拍亚洲一区欧美另类| 精品黄色免费中文电影在线播放| 久久精品视频99| 精灵使的剑舞无删减版在线观看| 国自产精品手机在线观看视频| 国产传媒在线| 国产精品久久久久久av福利软件 | 97影院秋霞午夜在线观看| 欧美日韩国产成人高清视频| 成人免费图片免费观看| 国产成人精品日本亚洲专区61| 免费一级欧美在线观看视频| 91aaaa| 亚洲免费福利一区| 亚洲午夜精品久久久久久浪潮| 亚洲免费二区| 国产精品网站免费| 日韩vs国产vs欧美| 红桃视频一区二区三区免费| 91亚洲精品久久久蜜桃网站 | 黄页网站在线看| 国产成人av一区| 成人影视免费观看| 国产精品乱码人人做人人爱 | 91黄色国产视频| 欧美18免费视频| 亚洲va电影大全| 巨人精品**| 伊人久久大香线蕉午夜av| 欧美日本一区| 手机看片福利盒子久久| 国产精品中文字幕欧美| 成人影视免费观看| 亚洲乱码精品一二三四区日韩在线| 久久午夜免费视频| 洋洋成人永久网站入口| 久久精品视频7| 日韩一区二区免费在线观看| 青青草视频免费在线观看| 久久精品国产成人| 手机在线理论片| 亚洲综合在线播放| 欧洲美女日日| 五月天激情图片| 六月丁香婷婷久久| 无码人妻精品一区二区三区温州 | h片在线播放| 日本久久久久久久久| 亚洲福利合集| 一区二区在线观| 久久久久久色| 国产高潮视频在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 国产污污视频在线观看| 51精品视频一区二区三区| 四虎精品在线| 亚洲精品国产综合区久久久久久久| av男人的天堂在线| 全亚洲最色的网站在线观看| 一区二区三区四区视频免费观看| 亚洲毛片aa| 水蜜桃久久夜色精品一区的特点 | 免费激情视频在线观看| 国产999精品久久久久久| а天堂中文在线资源| 色婷婷综合久久久| 日本黄色免费视频| 久久99精品视频一区97| 日本久久二区| 亚洲一区二区在线看| 日韩福利电影在线观看| 亚洲av无码一区二区二三区| 婷婷久久综合九色综合伊人色| xxxx18国产| 久久99精品久久久久久噜噜 | 伊人久久av| 激情视频在线观看一区二区三区| 欧美日韩影院| 师生出轨h灌满了1v1| 亚洲精品成人a在线观看| 国产又粗又猛又爽| 综合欧美国产视频二区| 国产经典一区| 亚洲国产精品综合| 免费高清视频精品| 中文字幕第69页| 3d动漫精品啪啪| av软件在线观看| 91偷拍精品一区二区三区| 欧美日韩福利| 大尺度在线观看| 精品magnet| 国外av在线| 国产精品免费小视频| 久久高清精品| 亚洲色图欧美自拍| 亚洲精品伦理在线| 欧美一区二区公司| 热久久视久久精品18亚洲精品| 少妇精品久久久| 牛夜精品久久久久久久| 国产精品卡一卡二卡三| 国产三级伦理片| 欧美激情久久久久| 国产成人一二片| 玩弄japan白嫩少妇hd| 中文字幕欧美三区| 国产伦理一区二区| 久久久这里只有精品视频| 亚洲自拍电影| 一级做a免费视频| 亚洲一二三区在线观看| 日韩精品视频无播放器在线看 | 久久99国产精品自在自在app| 大型av综合网站| 黄色一级一级片| 亚洲欧洲国产日本综合| 亚洲毛片在线播放| 日本欧美黄网站| 婷婷久久一区| 一女三黑人理论片在线| 欧美伊人精品成人久久综合97| 超碰在线网址| 久久这里精品国产99丫e6| 亚洲精品电影| 国模无码视频一区| 91久久精品国产91性色tv| 国产福利在线播放麻豆| 精品免费日产一区一区三区免费| 欧美a一区二区| 日韩欧美亚洲国产| 中文字幕亚洲精品| 精品国产一区二区三区成人影院| 丝袜制服一区二区三区| 亚洲在线一区二区三区| 中文日本在线观看| 国产一区二区不卡视频| 六月丁香婷婷久久|