一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解spring boot集成ehcache 2.x 用于hibernate二級(jí)緩存

詳解spring boot集成ehcache 2.x 用于hibernate二級(jí)緩存

2020-11-02 17:48yiduyangyi JAVA教程

本篇文章主要介紹了詳解spring boot集成ehcache 2.x 用于hibernate二級(jí)緩存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文將介紹如何在spring boot中集成ehcache作為hibernate二級(jí)緩存。各個(gè)框架版本如下

  1. spring boot:1.4.3.RELEASE
  2. spring framework: 4.3.5.RELEASE
  3. hibernate:5.0.1.Final(spring-boot-starter-data-jpa默認(rèn)依賴)
  4. ehcache:2.10.3

項(xiàng)目依賴

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
 
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
 
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-ehcache</artifactId>
 <exclusions>
  <exclusion>
   <groupId>net.sf.ehcache</groupId>
   <artifactId>ehcache-core</artifactId>
  </exclusion>
 </exclusions>
</dependency>
 
<dependency>
 <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache</artifactId>
 <version>2.10.3</version>
</dependency>

Ehcache簡(jiǎn)介

ehcache是一個(gè)純Java的緩存框架,既可以當(dāng)做一個(gè)通用緩存使用,也可以作為將其作為hibernate的二級(jí)緩存使用。緩存數(shù)據(jù)可選擇如下三種存儲(chǔ)方案

  1. MemoryStore – On-heap memory used to hold cache elements. This tier is subject to Java garbage collection.
  2. OffHeapStore – Provides overflow capacity to the MemoryStore. Limited in size only by available RAM. Not subject to Java garbage collection (GC). Available only with Terracotta BigMemory products.
  3. DiskStore – Backs up in-memory cache elements and provides overflow capacity to the other tiers.

hibernate二級(jí)緩存配置

hibernate的二級(jí)緩存支持entity和query層面的緩存,org.hibernate.cache.spi.RegionFactory各類可插拔的緩存提供商與hibernate的集成。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打開hibernate統(tǒng)計(jì)信息
spring.jpa.properties.hibernate.generate_statistics=true
 
# 打開二級(jí)緩存
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
 
# 打開查詢緩存
spring.jpa.properties.hibernate.cache.use_query_cache=true
 
# 指定緩存provider
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
 
# 配置shared-cache-mode
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE

關(guān)于hibernate緩存相關(guān)的所有配置可參考hibernate5.0官方文檔#緩存

ehcache配置文件

ehcache 2.x配置文件樣板參考官方網(wǎng)站提供的ehcache.xml。本例中使用的配置文件如下所示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"
  updateCheck="true" monitoring="autodetect"
  dynamicConfig="true">
 
 <diskStore path="user.dir/cache"/>
 <transactionManagerLookup class="net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup"
        properties="jndiName=java:/TransactionManager" propertySeparator=";"/>
 <cacheManagerEventListenerFactory class="com.yangyi.base.ehcache.CustomerCacheManagerEventListenerFactory" properties=""/>
 
 <defaultCache
  maxEntriesLocalHeap="0"
  eternal="false"
  timeToIdleSeconds="1200"
  timeToLiveSeconds="1200">
  <!--<terracotta/>-->
 </defaultCache>
 
 <cache name="entityCache"
   maxEntriesLocalHeap="1000"
   maxEntriesLocalDisk="10000"
   eternal="false"
   diskSpoolBufferSizeMB="20"
   timeToIdleSeconds="10"
   timeToLiveSeconds="20"
   memoryStoreEvictionPolicy="LFU"
   transactionalMode="off">
  <persistence strategy="localTempSwap"/>
  <cacheEventListenerFactory class="com.yangyi.base.ehcache.CustomerCacheEventListenerFactory" />
 </cache>
 
 <cache name="org.hibernate.cache.internal.StandardQueryCache"
   maxEntriesLocalHeap="5" eternal="false" timeToLiveSeconds="120">
  <persistence strategy="localTempSwap" />
  <cacheEventListenerFactory class="com.yangyi.base.ehcache.CustomerCacheEventListenerFactory" />
 </cache>
 
 <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
   maxEntriesLocalHeap="5000" eternal="true">
  <persistence strategy="localTempSwap" />
  <cacheEventListenerFactory class="com.yangyi.base.ehcache.CustomerCacheEventListenerFactory" />
 </cache>
</ehcache>

ehcache事件監(jiān)聽

在ehcache中,有兩大類事件,一是cacheManager相關(guān)的事件,如cache的init/added等;二是cahche相關(guān)的事件,如cache put/expire等。在ehcache中,默認(rèn)沒有這兩類事件的監(jiān)聽器,需要自主實(shí)現(xiàn)監(jiān)聽器以及監(jiān)聽器工廠類,然后配置到ehcache.xml中,方可生效。

上述ehcache.xml配置中,給自定義cache都配置了cacheEventListenerFactory,用于監(jiān)聽緩存事件。同時(shí)也配置了cacheManager Factory實(shí)現(xiàn)類。具體實(shí)現(xiàn)代碼如下

CacheManagerEventListener簡(jiǎn)單實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.yangyi.base.ehcache;
 
import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Status;
import net.sf.ehcache.event.CacheManagerEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * ehcache customer cacheManagerEventListener
 * Created by yangjinfeng on 2017/1/5.
 */
public class CustomerCacheManagerEventListener implements CacheManagerEventListener {
 
 private Logger logger = LoggerFactory.getLogger(getClass());
 
 private final CacheManager cacheManager;
 
 public CustomerCacheManagerEventListener(CacheManager cacheManager) {
  this.cacheManager = cacheManager;
 }
 
 @Override
 public void init() throws CacheException {
  logger.info("init ehcache...");
 }
 
 @Override
 public Status getStatus() {
  return null;
 }
 
 @Override
 public void dispose() throws CacheException {
  logger.info("ehcache dispose...");
 }
 
 @Override
 public void notifyCacheAdded(String s) {
  logger.info("cacheAdded... {}", s);
  logger.info(cacheManager.getCache(s).toString());
 }
 
 @Override
 public void notifyCacheRemoved(String s) {
 
 }
}

CacheManagerEventListenerFactory的簡(jiǎn)單實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.yangyi.base.ehcache;
 
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.event.CacheManagerEventListener;
import net.sf.ehcache.event.CacheManagerEventListenerFactory;
 
import java.util.Properties;
 
/**
 * Created by yangjinfeng on 2017/1/5.
 */
public class CustomerCacheManagerEventListenerFactory extends CacheManagerEventListenerFactory {
 @Override
 public CacheManagerEventListener createCacheManagerEventListener(CacheManager cacheManager, Properties properties) {
  return new CustomerCacheManagerEventListener(cacheManager);
 }
}

CacheEventListener的簡(jiǎn)單實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.yangyi.base.ehcache;
 
import net.sf.ehcache.CacheException;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Element;
import net.sf.ehcache.event.CacheEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * Created by yangjinfeng on 2017/1/5.
 */
public class CustomerCacheEventListener implements CacheEventListener {
 
 private Logger logger = LoggerFactory.getLogger(getClass());
 
 @Override
 public void notifyElementRemoved(Ehcache ehcache, Element element) throws CacheException {
  logger.info("cache removed. key = {}, value = {}", element.getObjectKey(), element.getObjectValue());
 }
 
 @Override
 public void notifyElementPut(Ehcache ehcache, Element element) throws CacheException {
  logger.info("cache put. key = {}, value = {}", element.getObjectKey(), element.getObjectValue());
 }
 
 @Override
 public void notifyElementUpdated(Ehcache ehcache, Element element) throws CacheException {
  logger.info("cache updated. key = {}, value = {}", element.getObjectKey(), element.getObjectValue());
 }
 
 @Override
 public void notifyElementExpired(Ehcache ehcache, Element element) {
  logger.info("cache expired. key = {}, value = {}", element.getObjectKey(), element.getObjectValue());
 }
 
 @Override
 public void notifyElementEvicted(Ehcache ehcache, Element element) {
  logger.info("cache evicted. key = {}, value = {}", element.getObjectKey(), element.getObjectValue());
 }
 
 @Override
 public void notifyRemoveAll(Ehcache ehcache) {
  logger.info("all elements removed. cache name = {}", ehcache.getName());
 }
 
 @Override
 public Object clone() throws CloneNotSupportedException {
  throw new CloneNotSupportedException();
 }
 
 @Override
 public void dispose() {
  logger.info("cache dispose.");
 }
}

CacheEventListenerFactory的簡(jiǎn)單實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yangyi.base.ehcache;
 
import net.sf.ehcache.event.CacheEventListener;
import net.sf.ehcache.event.CacheEventListenerFactory;
 
import java.util.Properties;
 
/**
 * Created by yangjinfeng on 2017/1/5.
 */
public class CustomerCacheEventListenerFactory extends CacheEventListenerFactory {
 @Override
 public CacheEventListener createCacheEventListener(Properties properties) {
  return new CustomerCacheEventListener();
 }
}

完成上述事件監(jiān)聽器的實(shí)現(xiàn)和配置后,我們可以啟動(dòng)應(yīng)用,查看下相應(yīng)事件監(jiān)聽器中輸出的log,以驗(yàn)證是否生效

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2017-01-07 10:27:07.810 INFO 4264 --- [   main] com.yangyi.Application     : Starting Application on yangjinfeng-pc with PID 4264 (E:\JavaWorkSpace\spring-boot-ehcache3-hibernate5-jcache\target\classes started by yangjinfeng in E:\JavaWorkSpace\spring-boot-ehcache3-hibernate5-jcache)
2017-01-07 10:27:07.810 INFO 4264 --- [   main] com.yangyi.Application     : No active profile set, falling back to default profiles: default
2017-01-07 10:27:07.865 INFO 4264 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@2ef3eef9: startup date [Sat Jan 07 10:27:07 CST 2017]; root of context hierarchy
2017-01-07 10:27:09.155 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$6eb4eae9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.191 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cache.annotation.ProxyCachingConfiguration' of type [class org.springframework.cache.annotation.ProxyCachingConfiguration$$EnhancerBySpringCGLIB$$b7c72107] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.206 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration' of type [class org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration$$EnhancerBySpringCGLIB$$ac3ae5ab] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.285 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.cache-org.springframework.boot.autoconfigure.cache.CacheProperties' of type [class org.springframework.boot.autoconfigure.cache.CacheProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.291 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.cache.CacheManagerCustomizers' of type [class org.springframework.boot.autoconfigure.cache.CacheManagerCustomizers] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.293 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration' of type [class org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46d9b2a9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.418 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : init ehcache...
2017-01-07 10:27:09.487 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : cacheAdded... org.hibernate.cache.spi.UpdateTimestampsCache
2017-01-07 10:27:09.487 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : [ name = org.hibernate.cache.spi.UpdateTimestampsCache status = STATUS_ALIVE eternal = true overflowToDisk = true maxEntriesLocalHeap = 5000 maxEntriesLocalDisk = 0 memoryStoreEvictionPolicy = LRU timeToLiveSeconds = 0 timeToIdleSeconds = 0 persistence = LOCALTEMPSWAP diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: com.yangyi.base.ehcache.CustomerCacheEventListener ; orderedCacheEventListeners: maxBytesLocalHeap = 0 overflowToOffHeap = false maxBytesLocalOffHeap = 0 maxBytesLocalDisk = 0 pinned = false ]
2017-01-07 10:27:09.487 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : cacheAdded... org.hibernate.cache.internal.StandardQueryCache
2017-01-07 10:27:09.487 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : [ name = org.hibernate.cache.internal.StandardQueryCache status = STATUS_ALIVE eternal = false overflowToDisk = true maxEntriesLocalHeap = 5 maxEntriesLocalDisk = 0 memoryStoreEvictionPolicy = LRU timeToLiveSeconds = 120 timeToIdleSeconds = 0 persistence = LOCALTEMPSWAP diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: com.yangyi.base.ehcache.CustomerCacheEventListener ; orderedCacheEventListeners: maxBytesLocalHeap = 0 overflowToOffHeap = false maxBytesLocalOffHeap = 0 maxBytesLocalDisk = 0 pinned = false ]
2017-01-07 10:27:09.503 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : cacheAdded... entityCache
2017-01-07 10:27:09.503 INFO 4264 --- [   main] .y.b.e.CustomerCacheManagerEventListener : [ name = entityCache status = STATUS_ALIVE eternal = false overflowToDisk = true maxEntriesLocalHeap = 1000 maxEntriesLocalDisk = 10000 memoryStoreEvictionPolicy = LFU timeToLiveSeconds = 20 timeToIdleSeconds = 10 persistence = LOCALTEMPSWAP diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: com.yangyi.base.ehcache.CustomerCacheEventListener ; orderedCacheEventListeners: maxBytesLocalHeap = 0 overflowToOffHeap = false maxBytesLocalOffHeap = 0 maxBytesLocalDisk = 0 pinned = false ]
2017-01-07 10:27:09.503 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'ehCacheCacheManager' of type [class net.sf.ehcache.CacheManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.503 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'cacheManager' of type [class org.springframework.cache.ehcache.EhCacheCacheManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.503 INFO 4264 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'cacheAutoConfigurationValidator' of type [class org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration$CacheManagerValidator] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-01-07 10:27:09.829 INFO 4264 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-01-07 10:27:09.839 INFO 4264 --- [   main] o.apache.catalina.core.StandardService : Starting service Tomcat
2017-01-07 10:27:09.839 INFO 4264 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.6
2017-01-07 10:27:09.924 INFO 4264 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext
2017-01-07 10:27:09.924 INFO 4264 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 2061 ms
 
2017-01-07 10:32:41.876 INFO 4264 --- [nio-8080-exec-1] c.y.b.e.CustomerCacheEventListener  : cache put. key = com.yangyi.entity.User#1, value = org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy$Item@1c13194d
2017-01-07 10:32:41.877 INFO 4264 --- [nio-8080-exec-1] c.y.b.e.CustomerCacheEventListener  : cache put. key = com.yangyi.entity.Authority#1, value = org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy$Item@2accc177
2017-01-07 10:32:41.878 INFO 4264 --- [nio-8080-exec-1] c.y.b.e.CustomerCacheEventListener  : cache put. key = com.yangyi.entity.Authority#2, value = org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy$Item@2b3b9c7e
2017-01-07 10:32:41.879 INFO 4264 --- [nio-8080-exec-1] c.y.b.e.CustomerCacheEventListener  : cache put. key = com.yangyi.entity.Authority#3, value = org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy$Item@4c31e58c

注解方式使用二級(jí)緩存

要使用entity cache,需要在entity上配上相應(yīng)的注解方可生效。javax.persistence.Cacheable注解標(biāo)記該entity使用二級(jí)緩存,org.hibernate.annotations.Cache注解指定緩存策略,以及存放到哪個(gè)緩存區(qū)域。

有關(guān)緩存策略詳細(xì)信息可參考hibernate5.0官方文檔#緩存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.yangyi.entity;
 
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.JoinTable;
 
@Entity
@Table(name = "users")
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache")
public class User implements Serializable {
 
}

最后,我們需要在spring boot應(yīng)用層面打開cache功能,使用org.springframework.cache.annotation.EnableCaching注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.yangyi;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
 
@SpringBootApplication
@EnableCaching
public class Application {
 
 public static void main(String[] args) {
  SpringApplication.run(Application.class, args);
 }
}

完整代碼

完整代碼示例見github

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/yiduyangyi/article/details/54176453

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲视频在线看 | 美国一级大黄大色毛片 | 精品综合 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 新影音先锋男人色资源网 | 免费又爽又黄禁片视频在线播放 | 成人国产在线视频在线观看 | 3d动漫美女物被遭强视频 | 日韩欧美一区二区三区免费看 | 欧美人xxxxxbbbb | 男人日女人的逼视频 | 毛片a级放荡的护士hd | 第一次破女视频国产一级 | 初尝黑人巨大h文 | 国产精品免费拍拍拍 | 国产精品视频自拍 | 97se狠狠狠狠狼亚洲综合网 | 护士柔佳 | 亚久久伊人精品青青草原2020 | 毛片网站大全 | 日韩欧美一区二区三区视频 | 牛牛色婷婷在线视频播放 | 四虎最新紧急更新地址 | 欧美男同互吃gay老头 | 苍井空av | 美国大片成人性网 | 日本欧美强乱视频在线 | 高跟翘臀老师后进式视频 | 成在线人免费视频一区二区三区 | 好硬好大好浪夹得好紧h | 美女自插 | 教师系列 大桥未久在线 | 91噜噜噜在线观看 | 亚洲国产精品日本无码网站 | 美女被绑着吸下部的故事 | 免费欧美一级 | 国四虎影永久 | 视频在线观看国产 | 国产精品视频在这里有精品 | 91视频无限看 | 欧美一区二区三区四区在线观看 |