久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

瀏覽:17日期:2023-07-16 14:24:24

1.在下面的案例中,執(zhí)行兩次查詢控制臺只會輸出一次 SQL 查詢:

mybatis-config.xml<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE configurationPUBLIC '-//mybatis.org//DTD Config 3.0//EN''http://mybatis.org/dtd/mybatis-3-config.dtd'><configuration> <environments default='development'><environment id='development'> <transactionManager type='JDBC'/> <dataSource type='POOLED'><property name='driver' value='com.mysql.jdbc.Driver'/><property name='url' value='jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8&autoReconnect=true'/><property name='username' value='xxx'/><property name='password' value='xxx'/> </dataSource></environment> </environments> <mappers><mapper resource='com/hrh/mapper/PersonMapper.xml'/> </mappers></configuration>

PersonMapper.xml<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd' ><mapper namespace='com.hrh.mapper.PersonMapper'> <resultMap type='com.hrh.bean.Person'><id column='id' property='id' jdbcType='BIGINT'/><result column='name' property='name' jdbcType='VARCHAR'/><result column='age' property='age' jdbcType='BIGINT'/> </resultMap> <sql id='Base_Column_List'> id, name, age </sql> <select resultType='com.hrh.bean.Person'>select<include refid='Base_Column_List'/>from tab_person </select></mapper>

public interface PersonMapper { List<Person> list();}

String resource = 'mybatis-config2.xml';InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();//開啟會話PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);mapper.list();mapper.list();

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

之所以會出現(xiàn)這種情況,是因為 Mybatis 存在一級緩存導致的,下面 debug 探究下內(nèi)部流程:

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

(1)mapper.list() 會進入 MapperProxy#invoke():參數(shù)proxy是一個代理對象(每個 Mapper 接口都會被轉(zhuǎn)換成一個代理對象),里面包含會話 sqlSession、接口信息、方法信息;method是目標方法(當前執(zhí)行的方法),它里面包含了所屬的哪個類(接口)、方法名、返回類型(List、Map、void 或其他)、參數(shù)類型等;args是參數(shù);

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) {return method.invoke(this, args); } else if (isDefaultMethod(method)) {return invokeDefaultMethod(proxy, method, args); } } catch (Throwable t) { throw ExceptionUtil.unwrapThrowable(t); } //從方法緩存methodCache中獲取到方法的信息:比如方法名、類型(select、update等)、返回類型 //如果獲取中沒有MapperMethod,則創(chuàng)建一個并放入methodCache中 final MapperMethod mapperMethod = cachedMapperMethod(method); //執(zhí)行查詢SQL并返回結(jié)果 return mapperMethod.execute(sqlSession, args); }

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

cacheMapperMethod:MapperMethod 包含方法名、類型(select、update等)、返回類型等信息

private MapperMethod cachedMapperMethod(Method method) { //緩存中獲取 MapperMethod mapperMethod = methodCache.get(method); //沒有則創(chuàng)建一個對象并放入緩存中供下次方便取用 if (mapperMethod == null) { mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration()); methodCache.put(method, mapperMethod); } return mapperMethod; }

(2)MapperMethod#execute()根據(jù) SQL 類型進入不同的查詢方法

public Object execute(SqlSession sqlSession, Object[] args) { //返回結(jié)果 Object result; //判斷語句類型 switch (command.getType()) { case INSERT: {//插入語句 Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.insert(command.getName(), param));break; } case UPDATE: {//更新語句Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.update(command.getName(), param));break; } case DELETE: {//刪除語句Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.delete(command.getName(), param));break; } case SELECT://查詢語句//返回空的查詢if (method.returnsVoid() && method.hasResultHandler()) { executeWithResultHandler(sqlSession, args); result = null; //返回List的查詢} else if (method.returnsMany()) { result = executeForMany(sqlSession, args); //返回Map的查詢} else if (method.returnsMap()) { result = executeForMap(sqlSession, args); //返回游標的查詢} else if (method.returnsCursor()) { result = executeForCursor(sqlSession, args);} else { Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param);}break; case FLUSH:result = sqlSession.flushStatements();break; default:throw new BindingException('Unknown execution method for: ' + command.getName()); } if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) { throw new BindingException('Mapper method ’' + command.getName() + ' attempted to return null from a method with a primitive return type (' + method.getReturnType() + ').'); } return result; }

(3)上面的案例是 select 語句,返回結(jié)果是List集合,所以進入 MapperMethod#executeForMany():

private <E> Object executeForMany(SqlSession sqlSession, Object[] args) { List<E> result; //獲取參數(shù) Object param = method.convertArgsToSqlCommandParam(args); //是否有分頁查詢 if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); result = sqlSession.<E>selectList(command.getName(), param, rowBounds); } else { result = sqlSession.<E>selectList(command.getName(), param); } // issue #510 Collections & arrays support //如果list中的泛型跟結(jié)果類型不一致,進行轉(zhuǎn)換 if (!method.getReturnType().isAssignableFrom(result.getClass())) { if (method.getReturnType().isArray()) {return convertToArray(result); } else {return convertToDeclaredCollection(sqlSession.getConfiguration(), result); } } return result; }

(4)selectList執(zhí)行了DefaultSqlSession#selectList():

public <E> List<E> selectList(String statement, Object parameter) { return this.selectList(statement, parameter, RowBounds.DEFAULT); }

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { try { //SQL執(zhí)行的信息:resource(xxMapper.xml)、id、sql、返回類型等 MappedStatement ms = configuration.getMappedStatement(statement); //執(zhí)行查詢 return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER); } catch (Exception e) { throw ExceptionFactory.wrapException('Error querying database. Cause: ' + e, e); } finally { ErrorContext.instance().reset(); } }

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

(5)接下來調(diào)用緩存執(zhí)行器的方法:CachingExecutor#query()

public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { //獲取到執(zhí)行SQL BoundSql boundSql = ms.getBoundSql(parameterObject); //將SQL包裝成一個緩存對對象,該對象和結(jié)果集組成鍵值對存儲到緩存中,方便下次直接從緩存中拿而不需要再次查詢 //createCacheKey:調(diào)用BaseExecutor#createCacheKey CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql); return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); }

public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { //獲取緩存 Cache cache = ms.getCache(); if (cache != null) { flushCacheIfRequired(ms); if (ms.isUseCache() && resultHandler == null) {ensureNoOutParams(ms, boundSql);@SuppressWarnings('unchecked')List<E> list = (List<E>) tcm.getObject(cache, key);if (list == null) { list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); tcm.putObject(cache, key, list); // issue #578 and #116}return list; } } //沒有緩存連接查詢 return delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); }

(6)接下來執(zhí)行 BaseExecutor#query():從下面可以看到將結(jié)果緩存到localCache 中了

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity('executing a query').object(ms.getId()); if (closed) { throw new ExecutorException('Executor was closed.'); } //如果不是嵌套查詢(默認為0),且 <select> 的 flushCache=true 時清空緩存 if (queryStack == 0 && ms.isFlushCacheRequired()) { clearLocalCache(); } List<E> list; try { //嵌套查詢層數(shù)+1 queryStack++; //從localCache緩存中獲取 list = resultHandler == null ? (List<E>) localCache.getObject(key) : null; if (list != null) {handleLocallyCachedOutputParameters(ms, key, parameter, boundSql); } else {//連接查詢list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql); } } finally { queryStack--; } //下面是延遲加載邏輯 if (queryStack == 0) { for (DeferredLoad deferredLoad : deferredLoads) {deferredLoad.load(); } // issue #601 deferredLoads.clear(); if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {// issue #482clearLocalCache(); } } return list; }

private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { List<E> list; //緩存中添加占位符 localCache.putObject(key, EXECUTION_PLACEHOLDER); try { //連接查詢獲取到數(shù)據(jù)結(jié)果 list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql); } finally { //刪除占位符 localCache.removeObject(key); } //將結(jié)果緩存起來 localCache.putObject(key, list); //處理存儲過程 if (ms.getStatementType() == StatementType.CALLABLE) { localOutputParameterCache.putObject(key, parameter); } return list; }

2.但當 Spring Framework + Mybatis 時,情況就不一樣了,每次查詢都會連接數(shù)據(jù)庫查詢,控制臺都會打印 SQL 出來,如下案例:

@Servicepublic class PersonService { @Autowired PersonMapper personMapper; public List<Person> getList() {personMapper.list();personMapper.list();return personMapper.list(); }}

@Configuration@ComponentScan('com.hrh')@MapperScan('com.hrh.mapper')public class MyBatisConfig { @Bean public SqlSessionFactoryBean sqlSessionFactory() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource());factoryBean.setMapperLocations(resolveMapperLocations());return factoryBean; } public Resource[] resolveMapperLocations() {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<String> mapperLocations = new ArrayList<>();mapperLocations.add('classpath*:com/hrh/mapper/*Mapper*.xml');List<Resource> resources = new ArrayList();if (mapperLocations != null) { for (String mapperLocation : mapperLocations) {try { Resource[] mappers = resourceResolver.getResources(mapperLocation); resources.addAll(Arrays.asList(mappers));} catch (IOException e) { // ignore} }}return resources.toArray(new Resource[resources.size()]); } @Bean public DataSource dataSource() {DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();driverManagerDataSource.setDriverClassName('com.mysql.jdbc.Driver');driverManagerDataSource.setUsername('xxx');driverManagerDataSource.setPassword('xxx');driverManagerDataSource.setUrl('jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8&autoReconnect=true');return driverManagerDataSource; }}

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyBatisConfig.class);PersonService bean = context.getBean(PersonService.class);bean.getList();

Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究

下面debug進入的步驟跟上面的(1)、(2)、(3)是一致的,但第四步卻是進入SqlSessionTemplate#selectList()中【SqlSessionTemplate是mybatis-spring-xx.jar的,上文的DefaultSqlSession是屬于mybatis-xx.jar的】:

public <E> List<E> selectList(String statement, Object parameter) { return this.selectList(statement, parameter, RowBounds.DEFAULT); }

接下來的selectList() 會被方法攔截:method.invoke() 會執(zhí)行到 DefaultSqlSession#selectList(),重新回到上文的第四步并且繼續(xù)下去,也就是在上文的(1)~(6)中插入了前后文,在其中做了關(guān)閉會話的操作;

private class SqlSessionInterceptor implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //得到會話 SqlSession sqlSession = getSqlSession( SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator); try {//執(zhí)行方法查詢Object result = method.invoke(sqlSession, args);if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) { // force commit even on non-dirty sessions because some databases require // a commit/rollback before calling close() sqlSession.commit(true);//在關(guān)閉會話前提交和回滾}return result; } catch (Throwable t) {//有異常拋出異常并結(jié)束會話Throwable unwrapped = unwrapThrowable(t);if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) { // release the connection to avoid a deadlock if the translator is no loaded. See issue #22 closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory); sqlSession = null; Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException) unwrapped); if (translated != null) { unwrapped = translated; }}throw unwrapped; } finally {//關(guān)閉會話if (sqlSession != null) { closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);} } } }總結(jié):

Mybatis 的一級緩存是會話級別的緩存(單線程的,特別雞肋),Mybatis 每創(chuàng)建一個 SqlSession 會話對象,就表示打開一次數(shù)據(jù)庫會話,在一次會話中,應用程序很可能在短時間內(nèi)反復執(zhí)行相同的查詢語句,如果不對數(shù)據(jù)進行緩存,則每查詢一次就要執(zhí)行一次數(shù)據(jù)庫查詢,這就造成數(shù)據(jù)庫資源的浪費。又因為通過 SqlSession 執(zhí)行的操作,實際上由 Executor 來完成數(shù)據(jù)庫操作的,所以在 Executor 中會建立一個簡單的緩存,即一級緩存;將每次的查詢結(jié)果緩存起來,再次執(zhí)行查詢的時候,會先查詢一級緩存(默認開啟的),如果命中,則直接返回,否則再去查詢數(shù)據(jù)庫并放入緩存中。

一級緩存的生命周期與 SqlSession 的生命周期相同,因此當 Mybatis 和Spring Framework 的集成包中擴展了一個 SqlSessionTemplate 類(它是一個代理類,增強了查詢方法),所有的查詢經(jīng)過 SqlSessionTemplate 代理攔截后再進入到 DefaultSqlSession#selectList() 中,結(jié)束查詢后把會話SqlSession 關(guān)了,所以導致了緩存失效。

那為什么要這么操作呢?

原始的 Mybatis 有暴露 SqlSession 接口,因此有 close 方法暴露出來供你選擇使用,你可以選擇關(guān)與不關(guān),但在Mybatis 和Spring Framework 的集成包中,SqlSession 是交給了Spring Framework 管理的,沒有暴露出來,為了穩(wěn)妥決定,直接給你關(guān)了。

到此這篇關(guān)于Mybatis一級緩存和結(jié)合Spring Framework后失效的源碼探究的文章就介紹到這了,更多相關(guān)Mybatis一級緩存Spring Framework失效內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 色欧美综合 | 曰批免费视频播放免费 | 国产精品一二三区 | 久久国产精品99久久久久久老狼 | 免费亚洲一区二区 | 国产欧美日韩综合精品一区二区 | 中文字幕三区 | 婷婷在线免费视频 | 欧美日黄 | 天堂中文资源在线 | 狠狠操夜夜操 | 成人午夜啪啪好大 | 一区久久 | 在线一级视频 | 久草成人网 | 国产情侣小视频 | 日韩欧美国产一区二区三区 | 日韩www | 成人性大片免费观看网站 | 欧美成人免费在线视频 | 免费在线精品视频 | 久久伊人久久 | 超碰在线播| 91.成人天堂一区 | 欧美a级成人淫片免费看 | 成人高清在线 | 亚洲精品视频在线看 | 国产免费拔擦拔擦8x高清在线人 | 国产二区视频 | 久久中文字幕一区 | 久久精品一区二区国产 | 亚洲一区二区三区视频 | 久久青青操 | 亚洲精品在线视频 | 精品中文字幕一区二区 | 99色影院 | 欧美一级在线观看 | 欧美精品1 | 真实国产露脸乱 | 国产91久久精品一区二区 | 精品乱子伦一区二区三区 | 超碰免费在 | 成人深夜在线观看 | 亚洲成人免费 | 国产精品久久久久久久久久久久久久 | 亚洲视频在线观看 | 日本亚洲视频 | 2020国产在线 | av一级在线观看 | 91超碰在线观看 | 亚洲免费在线观看视频 | 国产高清精品一区二区三区 | 亚洲精品视频免费 | 久热久爱 | 在线欧美 | 人人av在线 | 国产黄色免费网站 | 国产精品久久久久久吹潮 | 欧美三级电影在线观看 | 日韩精品1区2区 | 久久精品一区二区三区四区 | 日日夜夜精品 | 国产精品久久久久久久久久妞妞 | 精品九九| 日本免费网 | 欧美一区二区在线播放 | 欧美日韩大片在线观看 | 另类a v| 美女在线一区 | h色视频在线观看 | 99国产精品久久久久久久 | 日本一区二区三区四区不卡视频 | 日韩免费在线观看视频 | 日韩在线中文字幕 | 天天摸夜夜摸爽爽狠狠婷婷97 | 日韩中文在线 | 色婷婷av久久久久久久 | 久久精品色欧美aⅴ一区二区 | 91国偷自产一区二区三区亲奶 | www.成人在线视频 | 亚洲午夜电影在线 | 91精品国产99久久久久久红楼 | 日韩精品免费在线观看 | 亚洲三级不卡 | 国产亚洲精品久久久闺蜜 | 国产免费天天看高清影视在线 | 日韩国产在线 | 天天拍天天干天天操 | 欧美激情一区二区三级高清视频 | 亚洲一区中文字幕在线观看 | 日日碰碰 | 伊人伊人| 日韩不卡一二三 | 香蕉视频一级片 | 久久久99精品免费观看 | 欧美激情视频一区二区三区在线播放 | 成人在线观看h | 亚洲免费人成在线视频观看 | 天天曰天天干 | 国产一区二区三区久久久 | 亚洲综合久久网 | 自拍偷拍视频网站 | 一级高清视频 | 欧美日韩一区二区三区在线观看 | 精品一二区 | 成人免费一区二区三区视频网站 | 欧美黄色激情 | 国产精品日韩 | 色性网| av中文在线| 亚洲一区二区三区爽爽爽爽爽 | 日本污视频在线观看 | 免费亚洲网站 | 欧美理论片在线观看 | 韩国精品视频在线观看 | 亚洲三级视频 | 日韩精品www | 五月天婷婷免费视频 | av在线免费观看一区二区 | 日韩国产一区二区三区 | 91av在 | 一区二区视频网 | 日韩中文字幕免费在线 | 亚洲一区高清 | 日韩精品一区二区三区老鸭窝 | 精品欧美一区二区三区久久久 | 中文字幕亚洲精品 | 亚洲成人在线视频观看 | 97视频在线 | 99精品视频网 | 精品影视 | 久久亚洲精品国产一区 | 四影虎影ww4hu55.com | 日韩大尺度在线观看 | 欧美一区二区三区精品 | 在线观看日韩 | 黄色大片观看 | 太子妃好紧皇上好爽h | 99国产精品99久久久久久 | 91久久| 日韩av高清| 黄色一级片视频 | 欧美成年网站 | 91av免费在线 | 久久一区视频 | 台湾佬成人网 | 欧美日韩国产免费一区二区三区 | 91久久精品国产91久久性色tv | 日本精品在线播放 | 中文字幕在线免费 | 日韩视频二区 | 日韩高清在线 | 亚洲免费电影一区 | 9999久久久久 | 国产精品第一区第27页 | 午夜夜 | 欧美一区久久 | 九九天堂 | 亚洲 欧美日韩 国产 中文 | 一本色道久久综合狠狠躁篇的优点 | 天堂伊人网 | 欧美日韩免费 | 毛片网站在线 | 九色视频网站 | 操人网 | 国产99999 | 一区二区三区四区视频 | 特级毛片在线 | 久久精品美女 | 欧美性久久 | 九九色九九 | 久久久久久久久国产精品 | www日韩 | 亚洲国产精品一区二区久久 | 国产九九精品视频 | 99视频这里有精品 | 在线a视频 | 不卡一区二区三区四区 | 亚洲三级在线看 | 日韩精品一区二区三区四区视频 | 在线视频一区二区 | 国产一区二区视频免费看 | 亚洲精品国精品久久99热 | 99亚洲精品| 偷拍电影一区二区三区 | 日韩视频在线一区二区 | 欧美激情欧美激情在线五月 | 国产精品乱码一区二区三区 | 亚洲精品久久久久久下一站 | 91免费在线 | 奇米二区 | 日韩一区二区三区在线 | 国产成人精品999在线观看 | 操夜夜| 蜜桃精品在线观看 | 在线观看午夜免费视频 | 亚洲精品一二区 | 黄色毛片在线观看 | 久久久99久久久国产自输拍 | 国产欧美精品一区二区 | 欧美日韩不卡合集视频 | 亚洲精品国产综合 | 久久国内 | 日本videos18高清hd下 | 天天操天天碰 | 玖玖操 | 成人精品一区二区三区中文字幕 | 日韩精品免费在线观看 | 欧美成人精品一区二区 | 日韩国产精品一区二区三区 | 国产免费一区二区三区 | 日韩国产| 一区二区三区在线播放 | 国产精品久久久一区二区三区 | 91成人在线免费视频 | 亚洲免费影院 | 久久精品首页 | 欧美高清视频在线观看 | julia中文字幕久久一区二区 | 天天综合欧美 | 天天摸夜夜摸爽爽狠狠婷婷97 | 色噜噜视频 | 国产精品福利午夜在线观看 | 亚洲一区在线日韩在线深爱 | av网站免费观看 | 午夜精品久久久久 | 亚洲成熟少妇视频在线观看 | 91性高湖久久久久久久久_久久99 | 男女18免费网站视频 | 久久久国产一区 | 日韩成人av在线 | 在线一级视频 | 成人在线观看免费 | 久久99精品久久久久久久青青日本 | 成人午夜毛片 | 欧美日韩一区二区三区在线观看 | 欧美在线播放一区 | 九九视频这里只有精品 | 韩日精品 | 中文av字幕 | 亚洲第一av| 日韩av网站在线 | 久久草视频 | 国产免费av网站 | 亚洲精品亚洲人成人网 | 日韩在线视频一区 | 国产精品日韩欧美一区二区三区 | 国产精品高潮呻吟av久久4虎 | 射久久 | 亚洲欧美视频在线 | 久久久亚洲成人 | 国产一区二区久久久 | 久久久久在线 | 国产高潮好爽受不了了夜色 | 日韩二三区 | 日日骚视频 | 亚洲精品成人 | 国产在线综合视频 | 蜜桃一区| av免费网 | 日韩在线中文字幕 | 精品国产一区二区三区久久久 | 成人免费一区二区三区视频软件 | 精品成人一区 | 伊人春色网| 日韩成人在线观看 | 精品无码久久久久久国产 | 亚洲视频一区二区三区四区 | 国产成人在线看 | 国产一区二区观看 | 亚洲美女性视频 | 91欧美| 91免费版在线观看 | 国产九九精品 | 日韩欧美成人影院 | 一区二区在线免费观看 | 激情久久久| 国产视频中文字幕 | 午夜精品久久久久久久 | 日韩欧美二区 | 亚洲人成人一区二区在线观看 | 亚洲精品久久一区二区三区 | 中文无码日韩欧 | 一级毛片免费播放 | 国产亚洲欧美一区 | 国产一区亚洲二区三区 | 国产欧美综合一区二区三区 | 中文成人无字幕乱码精品 | 日韩国产欧美精品 | 中国特黄毛片 | 日韩电影在线 | 国产免费av一区二区三区 | 久久久久九九九九九 | 精品国产一区三区 | 超碰在线一区二区三区 | a级片在线观看 | 一区二区国产精品 | 国产亚洲女人久久久久毛片 | 欧美日韩国产一区二区三区 | jizz在线观看 | 久久久久久综合 | 天天天综合网 | 一区二区精品在线 | 亚洲免费视频一区二区 | av网站在线播放 | 一级毛片色一级 | 操操操操操操操操操操操操操操 | 在线视频se | 天天干网 | 午夜精品一区二区三区免费视频 | 91精品久久久久久久久久久 | 天天影视网色香欲综合网无拦截 | 欧美爱爱视频 | 久久精品六 | 欧洲国产伦久久久久久久 | 一区二区精品视频 | 在线视频成人 | 在线中文视频 | 我看一级毛片 | 亚洲一区不卡 | 国产免费av在线 | 精品国产乱码久久久久久1区二区 | 可以免费在线观看av的网站 | 第一色综合 | 国产亚洲精品久久久456 | 欧美黄色大片网站 | 日韩精品 电影一区 亚洲 | 久久成人在线 | 欧美精品91| 日韩免费高清视频 | 精品亚洲国产成av人片传媒 | 欧美一区二区在线免费观看 | 中文字幕亚洲一区二区三区 | 国产精品久久久久久久久久 | 国产精品视频久久久 | 亚洲成人免费av | 伊人伊人网 | 国产一区二区三区免费在线观看 | 国产精品久久久久无码av | 国产一级黄片毛片 | 九一在线观看 | 亚洲美女一区二区三区 | 久久国| √新版天堂资源在线资源 | 黄色一级大片在线免费看产 | av网址在线播放 | 毛片网站大全 | 嫩草视频在线观看免费 | 国产精品11| 91久久精品久久国产性色也91 | 中文字幕亚洲精品 | 久久久久久成人精品 | 精品亚洲一区二区 | 国产免费一区二区三区网站免费 | 久久精品国产精品青草 | 欧美日本韩国一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 爱爱免费视频网站 | 日韩艹逼视频 | 日韩免费电影 | 国产成人精品一区二区三区四区 | 青青草久草在线 | 美日韩免费视频 | 日韩精品一区二区三区 | 国产精品久久久久久吹潮 | 一级毛片中国 | 国产wwwcom | 久久伊人亚洲 | 日本一区二区三区四区视频 | 日韩精品久久理论片 | 中文字幕高清 | 亚洲精品91| a级黄色毛片免费观看 | 男人久久天堂 | 免费激情网站 | 噜噜噜噜狠狠狠7777视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 久草精品视频 | 精品亚洲一区二区三区 | 国产99久久久国产精品 | 99热最新网站 | 精品三级在线观看 | 亚洲国产中文字幕 | 99精品久久久国产一区二区三 | a国产视频 | www.久久99| 视频一区二区中文字幕日韩 | 亚洲视频自拍 | 国产中文字幕在线 | 国产精品成av人在线视午夜片 | 午夜精品久久久久久99热软件 | 中字幕视频在线永久在线观看免费 | 久久99精品久久久久子伦 | 国产欧美一区二区精品忘忧草 | 国产成人精| 国产伦精品久久久一区二区三区 | 欧美一区视频 | 国产成人精品一区二区三区视频 | 黄色小视频在线免费观看 | 亚洲九九 | 日韩一区二区三区在线 | 国产日韩免费 | 成人黄视频在线观看 | 国产精品黄网站在线观看 | 欧美一级在线免费观看 | 久久性 | 久久久久免费观看 | 一级a性色生活片毛片 | 国产精品久久久久久亚洲调教 | 网站一区二区三区 | 中文亚洲 | 日摸夜操 | 成人精品在线 | 亚洲国产精品99久久久久久久久 | 日韩精品一区二区三区在线观看 | 国产精品久久九九 | 在线国产视频 | 国产精品自拍视频 | 久久久高清 | 日本在线观看www | 久久国产一区二区三区 | 日韩中文久久 | 欧美另类一区二区 | 久久亚洲天堂 | 久久人| 久久综合久久综合久久综合 | 免费看a| 成人性视频免费网站 | 国产精品久久久久久妇女6080 | 亚洲va中文字幕 | 亚洲精品第一页 | 久久av一区二区三区 | 老师的朋友2 | 成人精品二区 | 精品日韩视频 | 国产中文视频 | 久久国产精品一区二区 | 一级毛片中国 | www.91av在线| 人人干网站 | 一区二区三区视频免费 | 中文字幕亚洲一区二区va在线 | 一区视频在线 | 国产69精品99久久久久久宅男 | 青青久久网| 久草视频首页 | 日本成人中文字幕 | 欧美视频二区 | 日韩一区二区成人 | 在线观看三级av | 99re免费视频精品全部 | 可以免费观看的av | 国产精品久久久久久二区 | 亚洲精区 | 日日爱视频 | 日韩欧美一二三区 | 一本一本久久a久久精品综合妖精 | 久久精品美女 | 欧美夜夜爽 | 国产a视频 | 交视频在线观看国产 | 99国产精品99久久久久久 | 国产精品免费在线 | 国产一区二区三区久久久 | 欧美日韩成人在线视频 | 欧美日韩精品一区二区在线播放 | 欧美中文字幕在线观看 | 久久av综合 | 福利片在线观看 | 羞羞视频免费在线观看 | 黄色地址 | 亚洲精品一区二区三区蜜桃久 | 毛片av片 | 国产免费黄视频 | 午夜视频一区二区三区 | 在线精品亚洲欧美日韩国产 | www免费网站在线观看 | 午夜爽视频 | 欧日韩毛片 | 刺激网| 成人免费视频观看 | 涩涩综合 | 国产极品视频在线观看 | 成人精品久久 | 亚洲日本二区 | 国产精品视频在线观看 | 成人免费网站 | 最新中文字幕在线 | 天堂av一区二区 | 亚洲一区久久 | 日韩综合网 | 日韩在线不卡视频 | 久久精品成人一区二区三区蜜臀 | av国产精品 | 日韩字幕一区 | 日韩久久一区二区 | 日韩精品一二区 | 日韩精品一区二区三区在线 | 久久久久中文字幕 | 国产成人在线视频 | 亚洲一区二区伦理 | 黄色毛片av| 成人av片在线观看 | 国产精品免费久久 | 黄色小视频免费观看 | 国产一级毛片在线视频 | 国产视频久久久 | 亚洲九九 | 免费看一区二区三区 | 日本亚洲国产一区二区三区 | 成人精品一区二区 | 久久久久亚洲视频 | 免费黄色片在线观看 | 久久一区二区三 | 国产精品www | 天天人人精品 | 亚洲一区二区视频在线观看 | 九九久久精品 | 91麻豆产精品久久久 | 欧美日韩高清不卡 | 一区二区三区在线免费播放 | 亚洲一区中文字幕在线观看 | 午夜久久久久 | 天天夜夜操操 | 在线视频一二区 | 欧美a一级 | 热re99久久精品国99热线看 | 中文字幕国产视频 | 杏导航aⅴ福利网站 | 波多野结衣一区在线观看 | 欧美日韩一区二区电影 | 懂色av一区二区三区在线播放 | 国产成人av免费 | 二区欧美 | 国产小视频在线播放 | a欧美 | 国产精品九九九 | 国产高清亚洲 | 亚洲视频免费看 | 黄色大片网站在线观看 | 国产精品精品视频一区二区三区 | 狠狠操网站 | 日本免费一区二区视频 | 欧美久久久久久久 | 成人毛片在线观看视频 | 免费日韩成人 | 亚洲激情 欧美 | 亚洲成人久久久 | 亚洲一二视频 | 2019天天干夜夜操 | 五月网婷婷 | 久久免费视频观看 | 国产精品欧美一区二区三区 | 欧美中文字幕 | 一区二区在线电影 | 影音先锋亚洲资源 | 亚洲无吗电影 | 91.com在线| 有码在线 | 日韩图区 | 精品人伦一区二区三区蜜桃视频 | 日韩美女av在线 | 国产精品永久在线 | 国产在线观看免费av | 久久99精品久久久久久噜噜 | 国产精品日韩一区二区 | 精品在线播放 | 欧美韩日 | 中文字幕在线导航 | 在线成人www免费观看视频 | 日韩影院在线 | 国产午夜手机精彩视频 | 高清国产一区二区三区 | 视频一区二区中文字幕日韩 | 中文字幕_第2页_高清免费在线 | 国产精品成人一区二区三区夜夜夜 | 亚洲激情av| 狠狠躁夜夜躁人人爽天天天天97 | www精品 | 精品久久香蕉国产线看观看亚洲 | 精品无码久久久久国产 | 国产一级片 | 成人免费在线电影 | 青青草国产 | 欧美日韩大陆 | 国产精品久久久久久久久 | 久久色视频 | 91无吗| 九九综合九九综合 | 国产成人精品一区二区三区视频 | 成人免费视频网站在线看 | 成人久久久久久久 | 精品成人av| 精品九九 | 国产精一区二区 | 在线欧美一区 | 麻豆精品一区二区 | 中国妞xxx| 久久综合久久综合久久综合 | 久久久精彩视频 | 日韩在线www | 亚洲一二三 | 欧美日韩一区二区三区在线观看 | av 一区二区三区 | 日本三级电影免费 | 国精产品一区一区三区免费完 | 欧美一级片在线观看 | 美女黄视频网站 | 95香蕉视频 | 欧美视频三区 | 亚洲一区精品视频 | 精品国产一区二区三区久久久 | 亚洲福利一区 | 国产精品久久久久一区二区三区 | 中文字幕亚洲欧美日韩在线不卡 |