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

Spring Batch 批處理框架,真心強啊!!

開發 架構
Spring Batch是一個輕量級,全面的批處理框架,旨在開發對企業系統日常運營至關重要的強大批處理應用程序。

Spring Batch是spring提供的一個數據處理框架。企業域中的許多應用程序需要批量處理才能在關鍵任務環境中執行業務操作。這些業務運營包括:

  • 無需用戶交互即可最有效地處理大量信息的自動化,復雜處理。這些操作通常包括基于時間的事件(例如月末計算,通知或通信)。
  • 在非常大的數據集中重復處理復雜業務規則的定期應用(例如,保險利益確定或費率調整)。
  • 集成從內部和外部系統接收的信息,這些信息通常需要以事務方式格式化,驗證和處理到記錄系統中。批處理用于每天為企業處理數十億的交易。

Spring Batch是一個輕量級,全面的批處理框架,旨在開發對企業系統日常運營至關重要的強大批處理應用程序。Spring Batch構建了人們期望的Spring Framework特性(生產力,基于POJO的開發方法和一般易用性),同時使開發人員可以在必要時輕松訪問和利用更高級的企業服務。Spring Batch不是一個schuedling的框架。

Spring Batch提供了可重用的功能,這些功能對于處理大量的數據至關重要,包括記錄/跟蹤,事務管理,作業處理統計,作業重啟,跳過和資源管理。它還提供更高級的技術服務和功能,通過優化和分區技術實現極高容量和高性能的批處理作業。

Spring Batch可用于兩種簡單的用例(例如將文件讀入數據庫或運行存儲過程)以及復雜的大量用例(例如在數據庫之間移動大量數據,轉換它等等) 上)。大批量批處理作業可以高度可擴展的方式利用該框架來處理大量信息。

Spring Batch架構介紹

一個典型的批處理應用程序大致如下:

  • 從數據庫,文件或隊列中讀取大量記錄。
  • 以某種方式處理數據。
  • 以修改之后的形式寫回數據。

其對應的示意圖如下:

圖片

spring batch的一個總體的架構如下:

圖片

在spring batch中一個job可以定義很多的步驟step,在每一個step里面可以定義其專屬的ItemReader用于讀取數據,ItemProcesseor?用于處理數據,ItemWriter用于寫數據,而每一個定義的job則都在JobRepository?里面,我們可以通過JobLauncher來啟動某一個job。關注公眾號:“碼猿技術專欄”,回復關鍵詞:“081“ 獲取阿里內部的Spring Cloud Alibaba進階教程!

Spring Batch核心概念介紹

下面是一些概念是Spring batch框架中的核心概念。

什么是Job

Job和Step是spring batch執行批處理任務最為核心的兩個概念。

其中Job是一個封裝整個批處理過程的一個概念。Job在spring batch的體系當中只是一個最頂層的一個抽象概念,體現在代碼當中則它只是一個最上層的接口,其代碼如下: 

/**
* Batch domain object representing a job. Job is an explicit abstraction
* representing the configuration of a job specified by a developer. It should
* be noted that restart policy is applied to the job as a whole and not to a
* step.
*/
public interface Job {

String getName();


boolean isRestartable();


void execute(JobExecution execution);


JobParametersIncrementer getJobParametersIncrementer();


JobParametersValidator getJobParametersValidator();

}

在Job這個接口當中定義了五個方法,它的實現類主要有兩種類型的job,一個是simplejob,另一個是flowjob。在spring batch當中,job是最頂層的抽象,除job之外我們還有JobInstance?以及JobExecution這兩個更加底層的抽象。推薦Java之家:www.java-fmaily.cn

一個job是我們運行的基本單位,它內部由step組成。job本質上可以看成step的一個容器。一個job可以按照指定的邏輯順序組合step,并提供了我們給所有step設置相同屬性的方法,例如一些事件監聽,跳過策略。

Spring Batch以SimpleJob?類的形式提供了Job接口的默認簡單實現,它在Job之上創建了一些標準功能。一個使用java config的例子代碼如下:

@Bean
public Job footballJob() {
return this.jobBuilderFactory.get("footballJob")
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.end()
.build();
}

這個配置的意思是:首先給這個job起了一個名字叫footballJob?,接著指定了這個job的三個step,他們分別由方法,playerLoad,gameLoad, playerSummarization實現。

什么是JobInstance

我們在上文已經提到了JobInstance,他是Job的更加底層的一個抽象,他的定義如下:

public interface JobInstance {
/**
* Get unique id for this JobInstance.
* @return instance id
*/
public long getInstanceId();
/**
* Get job name.
* @return value of 'id' attribute from <job>
*/
public String getJobName();
}

他的方法很簡單,一個是返回Job的id,另一個是返回Job的名字。

JobInstance指的是job運行當中,作業執行過程當中的概念。Instance本就是實例的意思。關注公眾號:“碼猿技術專欄”,回復關鍵詞:“081“ 獲取阿里內部的Spring Cloud Alibaba進階教程!

比如說現在有一個批處理的job,它的功能是在一天結束時執行行一次。我們假定這個批處理job的名字為'EndOfDay?'。在這個情況下,那么每天就會有一個邏輯意義上的JobInstance, 而我們必須記錄job的每次運行的情況。

什么是JobParameters

在上文當中我們提到了,同一個job每天運行一次的話,那么每天都有一個jobIntsance?,但他們的job定義都是一樣的,那么我們怎么來區別一個job的不同jobinstance?了。不妨先做個猜想,雖然jobinstance的job定義一樣,但是他們有的東西就不一樣,例如運行時間。

spring batch中提供的用來標識一個jobinstance?的東西是:JobParameters。JobParameters?對象包含一組用于啟動批處理作業的參數,它可以在運行期間用于識別或甚至用作參考數據。我們假設的運行時間,就可以作為一個JobParameters。

例如, 我們前面的'EndOfDay'的job現在已經有了兩個實例,一個產生于1月1日,另一個產生于1月2日,那么我們就可以定義兩個JobParameter?對象:一個的參數是01-01, 另一個的參數是01-02。因此,識別一個JobInstance的方法可以定義為:

圖片

因此,我么可以通過Jobparameter?來操作正確的JobInstance

什么是JobExecution

JobExecution?指的是單次嘗試運行一個我們定義好的Job的代碼層面的概念。job的一次執行可能以失敗也可能成功。只有當執行成功完成時,給定的與執行相對應的JobInstance才也被視為完成。

還是以前面描述的EndOfDay的job作為示例,假設第一次運行01-01-2019的JobInstance?結果是失敗。那么此時如果使用與第一次運行相同的Jobparameter?參數(即01-01-2019)作業參數再次運行,那么就會創建一個對應于之前jobInstance?的一個新的JobExecution?實例,JobInstance仍然只有一個。

JobExecution的接口定義如下:

public interface JobExecution {
/**
* Get unique id for this JobExecution.
* @return execution id
*/
public long getExecutionId();
/**
* Get job name.
* @return value of 'id' attribute from <job>
*/
public String getJobName();
/**
* Get batch status of this execution.
* @return batch status value.
*/
public BatchStatus getBatchStatus();
/**
* Get time execution entered STARTED status.
* @return date (time)
*/
public Date getStartTime();
/**
* Get time execution entered end status: COMPLETED, STOPPED, FAILED
* @return date (time)
*/
public Date getEndTime();
/**
* Get execution exit status.
* @return exit status.
*/
public String getExitStatus();
/**
* Get time execution was created.
* @return date (time)
*/
public Date getCreateTime();
/**
* Get time execution was last updated updated.
* @return date (time)
*/
public Date getLastUpdatedTime();
/**
* Get job parameters for this execution.
* @return job parameters
*/
public Properties getJobParameters();

}

每一個方法的注釋已經解釋的很清楚,這里不再多做解釋。只提一下BatchStatus,JobExecution?當中提供了一個方法getBatchStatus?用于獲取一個job某一次特地執行的一個狀態。BatchStatus是一個代表job狀態的枚舉類,其定義如下:

public enum BatchStatus {STARTING, STARTED, STOPPING, 
STOPPED, FAILED, COMPLETED, ABANDONED }

這些屬性對于一個job的執行來說是非常關鍵的信息,并且spring batch會將他們持久到數據庫當中. 在使用Spring batch的過程當中spring batch會自動創建一些表用于存儲一些job相關的信息,用于存儲JobExecution?的表為batch_job_execution,下面是一個從數據庫當中截圖的實例:

圖片

什么是Step

每一個Step對象都封裝了批處理作業的一個獨立的階段。事實上,每一個Job本質上都是由一個或多個步驟組成。每一個step包含定義和控制實際批處理所需的所有信息。

任何特定的內容都由編寫Job的開發人員自行決定。一個step可以非常簡單也可以非常復雜。例如,一個step的功能是將文件中的數據加載到數據庫中,那么基于現在spring batch的支持則幾乎不需要寫代碼。更復雜的step可能具有復雜的業務邏輯,這些邏輯作為處理的一部分。

與Job一樣,Step具有與JobExecution類似的StepExecution,如下圖所示:

圖片

什么是StepExecution

StepExecution表示一次執行Step, 每次運行一個Step時都會創建一個新的StepExecution?,類似于JobExecution?。但是,某個步驟可能由于其之前的步驟失敗而無法執行。且僅當Step實際啟動時才會創建StepExecution。

一次step執行的實例由StepExecution?類的對象表示。每個StepExecution?都包含對其相應步驟的引用以及JobExecution和事務相關的數據,例如提交和回滾計數以及開始和結束時間。

此外,每個步驟執行都包含一個ExecutionContext,其中包含開發人員需要在批處理運行中保留的任何數據,例如重新啟動所需的統計信息或狀態信息。下面是一個從數據庫當中截圖的實例:

圖片

什么是ExecutionContext

ExecutionContext?即每一個StepExecution? 的執行環境。它包含一系列的鍵值對。我們可以用如下代碼獲取ExecutionContext:

ExecutionContext ecStep = stepExecution.getExecutionContext();
ExecutionContext ecJob = jobExecution.getExecutionContext();

什么是JobRepository

JobRepository?是一個用于將上述job,step等概念進行持久化的一個類。它同時給Job和Step以及下文會提到的JobLauncher實現提供CRUD操作。

首次啟動Job時,將從repository?中獲取JobExecution?,并且在執行批處理的過程中,StepExecution和JobExecution將被存儲到repository當中。

@EnableBatchProcessing?注解可以為JobRepository提供自動配置。

什么是JobLauncher

JobLauncher這個接口的功能非常簡單,它是用于啟動指定了JobParameters?的Job,為什么這里要強調指定了JobParameter?,原因其實我們在前面已經提到了,jobparameter和job一起才能組成一次job的執行。下面是代碼實例:

public interface JobLauncher {

public JobExecution run(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException,
JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}

上面run方法實現的功能是根據傳入的job以及jobparamaters從JobRepository?獲取一個JobExecution并執行Job。

什么是Item Reader

ItemReader是一個讀數據的抽象,它的功能是為每一個Step提供數據輸入。當ItemReader以及讀完所有數據時,它會返回null來告訴后續操作數據已經讀完。Spring Batch為ItemReader?提供了非常多的有用的實現類,比如JdbcPagingItemReader,JdbcCursorItemReader等等。

ItemReader支持的讀入的數據源也是非常豐富的,包括各種類型的數據庫,文件,數據流,等等。幾乎涵蓋了我們的所有場景。

下面是一個JdbcPagingItemReader的例子代碼:

@Bean
public JdbcPagingItemReader itemReader(DataSource dataSource, PagingQueryProvider queryProvider) {
Map<String, Object> parameterValues = new HashMap<>();
parameterValues.put("status", "NEW");

return new JdbcPagingItemReaderBuilder<CustomerCredit>()
.name("creditReader")
.dataSource(dataSource)
.queryProvider(queryProvider)
.parameterValues(parameterValues)
.rowMapper(customerCreditMapper())
.pageSize(1000)
.build();
}

@Bean
public SqlPagingQueryProviderFactoryBean queryProvider() {
SqlPagingQueryProviderFactoryBean provider = new SqlPagingQueryProviderFactoryBean();

provider.setSelectClause("select id, name, credit");
provider.setFromClause("from customer");
provider.setWhereClause("where status=:status");
provider.setSortKey("id");

return provider;
}

JdbcPagingItemReader?必須指定一個PagingQueryProvider,負責提供SQL查詢語句來按分頁返回數據。

下面是一個JdbcCursorItemReader的例子代碼:

 private JdbcCursorItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,
String tenant) {

JdbcCursorItemReader<Map<String, Object>> itemReader = new JdbcCursorItemReader<>();
itemReader.setDataSource(dataSource);
itemReader.setSql("sql here");
itemReader.setRowMapper(new RowMapper());
return itemReader;
}

什么是Item Writer

既然ItemReader是讀數據的一個抽象,那么ItemWriter自然就是一個寫數據的抽象,它是為每一個step提供數據寫出的功能。寫的單位是可以配置的,我們可以一次寫一條數據,也可以一次寫一個chunk的數據,關于chunk下文會有專門的介紹。ItemWriter對于讀入的數據是不能做任何操作的。

Spring Batch為ItemWriter也提供了非常多的有用的實現類,當然我們也可以去實現自己的writer功能。

什么是Item Processor

ItemProcessor?對項目的業務邏輯處理的一個抽象, 當ItemReader?讀取到一條記錄之后,ItemWriter還未寫入這條記錄之前,I我們可以借助temProcessor提供一個處理業務邏輯的功能,并對數據進行相應操作。

如果我們在ItemProcessor?發現一條數據不應該被寫入,可以通過返回null來表示。ItemProcessor和ItemReader以及ItemWriter可以非常好的結合在一起工作,他們之間的數據傳輸也非常方便。我們直接使用即可。

chunk 處理流程

spring batch提供了讓我們按照chunk處理數據的能力,一個chunk的示意圖如下:

圖片

它的意思就和圖示的一樣,由于我們一次batch的任務可能會有很多的數據讀寫操作,因此一條一條的處理并向數據庫提交的話效率不會很高,因此spring batch提供了chunk這個概念,我們可以設定一個chunk size?,spring batch 將一條一條處理數據,但不提交到數據庫,只有當處理的數據數量達到chunk size設定的值得時候,才一起去commit.

java的實例定義代碼如下:

圖片圖片

在上面這個step里面,chunk size被設為了10,當ItemReader讀的數據數量達到10的時候,這一批次的數據就一起被傳到itemWriter?,同時transaction被提交。

skip策略和失敗處理

一個batch的job的step,可能會處理非常大數量的數據,難免會遇到出錯的情況,出錯的情況雖出現的概率較小,但是我們不得不考慮這些情況,因為我們做數據遷移最重要的是要保證數據的最終一致性。spring batch當然也考慮到了這種情況,并且為我們提供了相關的技術支持,請看如下bean的配置:

圖片

我們需要留意這三個方法,分別是skipLimit(),skip(),noSkip(),skipLimit方法的意思是我們可以設定一個我們允許的這個step可以跳過的異常數量,假如我們設定為10,則當這個step運行時,只要出現的異常數目不超過10,整個step都不會fail。

注意,若不設定skipLimit,則其默認值是0。

skip方法我們可以指定我們可以跳過的異常,因為有些異常的出現,我們是可以忽略的。

noSkip方法的意思則是指出現這個異常我們不想跳過,也就是從skip的所以exception?當中排除這個exception,從上面的例子來說,也就是跳過所有除FileNotFoundException?的exception。那么對于這個step來說,FileNotFoundException?就是一個fatal的exception?,拋出這個exception的時候step就會直接fail

批處理操作指南

本部分是一些使用spring batch時的值得注意的點。

批處理原則

在構建批處理解決方案時,應考慮以下關鍵原則和注意事項:

(1) 批處理體系結構通常會影響體系結構

(2) 盡可能簡化并避免在單批應用程序中構建復雜的邏輯結構

(3) 保持數據的處理和存儲在物理上靠得很近(換句話說,將數據保存在處理過程中)。

(4) 最大限度地減少系統資源的使用,尤其是I / O?. 在internal memory中執行盡可能多的操作。

(5) 查看應用程序I / O?(分析SQL語句)以確保避免不必要的物理I / O. 特別是,需要尋找以下四個常見缺陷:

  • 當數據可以被讀取一次并緩存或保存在工作存儲中時,讀取每個事務的數據。
  • 重新讀取先前在同一事務中讀取數據的事務的數據。
  • 導致不必要的表或索引掃描。
  • 未在SQL語句的WHERE子句中指定鍵值。

(6) 在批處理運行中不要做兩次一樣的事情。例如,如果需要數據匯總以用于報告目的,則應該(如果可能)在最初處理數據時遞增存儲的總計,因此您的報告應用程序不必重新處理相同的數據。

(7) 在批處理應用程序開始時分配足夠的內存,以避免在此過程中進行耗時的重新分配。

(8) 總是假設數據完整性最差。插入適當的檢查和記錄驗證以維護數據完整性。

(9) 盡可能實施校驗和以進行內部驗證。例如,對于一個文件里的數據應該有一個數據條數紀錄,告訴文件中的記錄總數以及關鍵字段的匯總。

(10) 在具有真實數據量的類似生產環境中盡早計劃和執行壓力測試。

(11) 在大批量系統中,數據備份可能具有挑戰性,特別是如果系統以24-7在線的情況運行。數據庫備份通常在在線設計中得到很好的處理,但文件備份應該被視為同樣重要。如果系統依賴于文件,則文件備份過程不僅應該到位并記錄在案,還應定期進行測試。

如何默認不啟動job

在使用java config使用spring batch的job時,如果不做任何配置,項目在啟動時就會默認去跑我們定義好的批處理job。那么如何讓項目在啟動時不自動去跑job呢?

spring batch的job會在項目啟動時自動run,如果我們不想讓他在啟動時run的話,可以在application.properties中添加如下屬性:

spring.batch.job.enabled=false

在讀數據時內存不夠

在使用spring batch做數據遷移時,發現在job啟動后,執行到一定時間點時就卡在一個地方不動了,且log也不再打印,等待一段時間之后,得到如下錯誤:

圖片

紅字的信息為:Resource exhaustion event:the JVM was unable to allocate memory from the heap。

翻譯過來的意思就是項目發出了一個資源耗盡的事件,告訴我們java虛擬機無法再為堆分配內存。

造成這個錯誤的原因是: 這個項目里的batch job的reader是一次性拿回了數據庫里的所有數據,并沒有進行分頁,當這個數據量太大時,就會導致內存不夠用。解決的辦法有兩個:

  • 調整reader讀數據邏輯,按分頁讀取,但實現上會麻煩一些,且運行效率會下降
  • 增大service內存
責任編輯:趙寧寧 來源: 碼猿技術專欄
相關推薦

2020-12-11 11:26:47

Spring批處理重試

2023-08-22 08:01:42

SpringBatch事務管理

2017-01-12 14:50:15

大數據Spring Batc框架

2020-11-03 15:10:55

Spring Batc框架Java

2025-07-29 02:00:00

2025-08-04 09:33:42

2012-02-20 09:49:42

ibmdw

2009-07-22 16:43:22

iBATIS框架iBATIS優化

2009-07-24 16:42:46

iBatis框架做ba

2025-04-29 08:00:36

2022-03-07 14:39:01

前端框架批處理

2024-05-06 08:41:05

Spring應用大數據

2024-12-27 14:45:59

2025-08-05 01:45:00

2010-07-16 10:42:14

telnet批處理

2009-06-18 15:40:07

Spring Batc

2012-11-13 17:23:16

長城電腦

2025-10-14 09:12:49

2025-07-09 04:00:00

2024-08-14 08:11:41

點贊
收藏

51CTO技術棧公眾號

国产精品伦一区二区| 黄色www视频| 大片网站久久| 欧美一个色资源| 国产精品国产三级国产专区51| 天天操天天干天天舔| 蜜臀va亚洲va欧美va天堂| 久久精品久久久久久国产 免费| 久久久久久久久久影视| 亚洲承认视频| 夜夜精品视频一区二区| 欧美一区二区视频17c| 影音先锋黄色网址| 亚洲精一区二区三区| 色噜噜国产精品视频一区二区| 中文字幕乱妇无码av在线| 性爽视频在线| 亚洲欧美日韩电影| 久久精精品视频| 国产v在线观看| 久久综合九色综合欧美狠狠| 欧美多人爱爱视频网站| 国产伦理片在线观看| 岛国精品一区| 制服丝袜在线91| 国产又黄又猛视频| 丁香花在线观看完整版电影| 亚洲国产精品成人久久综合一区| 国产精品国产三级国产专区53| 中文字幕av无码一区二区三区| 亚洲特色特黄| 欧美精品在线网站| 日韩一区二区三区四区视频| 免费看成人吃奶视频在线| 精品国产髙清在线看国产毛片| 中文字幕第80页| 亚洲人体影院| 亚洲第一激情av| 美女av免费观看| 免费黄色网页在线观看| 国产欧美中文在线| 久久久久久久久久久久久久一区 | 蜜桃网站成人| 性做久久久久久久| 国产乱子轮精品视频| 国产欧美亚洲精品| 中文字幕乱码人妻无码久久| 久久男女视频| 国产精品96久久久久久| 国产精品suv一区| 午夜亚洲伦理| 欧美在线亚洲一区| www.国产com| 亚久久调教视频| 奇米影视亚洲狠狠色| 久久久久99精品成人片我成大片| 在线亚洲激情| 日产日韩在线亚洲欧美| 日本视频在线观看免费| 久久av一区二区三区| 欧洲精品在线视频| 少妇高潮av久久久久久| 视频一区二区三区中文字幕| 国产精品久久999| 91麻豆精品在线| 七七婷婷婷婷精品国产| 国产日韩欧美中文| 999av视频| 成人中文字幕在线| 精品国产乱码久久久久久久软件| 日本中文字幕电影在线观看| 久久久三级国产网站| 性欧美大战久久久久久久免费观看 | 日韩亚洲欧美中文字幕| 亚洲中无吗在线| 欧美精品九九久久| 综合激情网五月| 全国精品久久少妇| 亚洲精品免费av| 国产 日韩 欧美 综合| 91在线观看免费视频| 茄子视频成人在线观看| 激情在线小视频| 亚洲午夜国产一区99re久久| 男女av免费观看| 日本在线一区二区| 精品久久久久久久久久久久包黑料 | 国产午夜久久久久| 在线日韩av永久免费观看| 午夜影院免费在线| 日韩欧美国产骚| 亚洲欧美日韩精品一区| caoporn成人免费视频在线| 精品亚洲夜色av98在线观看| 丁香六月激情综合| 国产专区一区| 国产精品视频yy9099| www.天堂在线| 国产欧美一区二区精品秋霞影院| 色一情一乱一乱一区91| 午夜影院在线观看国产主播| 欧美日韩国产高清一区二区三区| 白嫩情侣偷拍呻吟刺激| 久久美女视频| 91精品国产高清自在线看超| 亚洲手机在线观看| 91一区一区三区| 一区二区三区我不卡| 欧美激情20| 日韩写真欧美这视频| 国产精品亚洲无码| 国产精品多人| 成人国产精品色哟哟| 天堂成人在线| 一级做a爱片久久| 男女啪啪网站视频| 老司机成人在线| 久久精品国产视频| 中文字幕一区二区三区四区欧美| 国产91精品精华液一区二区三区| 日韩精品不卡| 日韩大片免费观看| 日韩女优av电影| 欧美日韩生活片| 日韩av电影天堂| 精品一区二区国产| 美洲精品一卡2卡三卡4卡四卡| 欧美色精品在线视频| a毛片毛片av永久免费| 好看不卡的中文字幕| 91久久久久久久一区二区| 黄色影院在线播放| 欧美视频在线观看免费| 免费不卡的av| 欧美日韩精品一本二本三本| 成人精品在线观看| 日本中文字幕在线视频| 欧美性猛交xxxx乱大交退制版| 久久亚洲AV成人无码国产野外| 在线看片一区| 成人免费视频视频在| 1stkiss在线漫画| 56国语精品自产拍在线观看| eeuss中文字幕| 免费观看日韩av| 日韩av电影在线观看| videos性欧美另类高清| 日韩精品视频免费专区在线播放 | 天堂中文а√在线| 欧美午夜寂寞影院| 亚欧精品视频一区二区三区| 日本美女一区二区| 亚洲春色在线视频| 国产成人精选| 最好看的2019年中文视频| 天天天天天天天干| 国产欧美日韩久久| 9l视频白拍9色9l视频| 色999国产精品| 91精品免费视频| 最新国产在线拍揄自揄视频| 日韩精品一区二区三区蜜臀| 久久久久久久国产精品毛片| 成人午夜伦理影院| 免费 成 人 黄 色| 天堂俺去俺来也www久久婷婷| 2021久久精品国产99国产精品| 四虎精品成人影院观看地址| 色菇凉天天综合网| 少妇太紧太爽又黄又硬又爽小说| 精品亚洲国内自在自线福利| 日韩欧美一级在线| 男人的天堂久久| 国产成人精品久久久| 日本高清在线观看wwwww色| 在线成人免费视频| 日本免费观看视| 久久综合色一综合色88| 日韩肉感妇bbwbbwbbw| 国产精品99在线观看| 国产精品av一区| 欧美aa视频| 久久综合九色九九| 无码h黄肉3d动漫在线观看| 日本精品一级二级| www.99re7| 91毛片在线观看| 伊人色在线观看| 99在线精品免费视频九九视| 日韩精品大片| 91精品啪在线观看国产爱臀 | 久久免费一级片| 美女主播精品视频一二三四| 国产精品久久久久77777| 国产美女av在线| 国产午夜精品久久久| 91成人国产综合久久精品| 午夜精品久久久久久不卡8050| 黄色片在线观看免费| 高清不卡一二三区| 九九热免费精品视频| 亚洲天堂偷拍| 亚洲一二三区在线| 欧美变态网站| 91精品在线看| 欧美日韩在线精品一区二区三区激情综合 | 欧美裸体网站| 亚洲精品一区二区三区中文字幕| 热门国产精品亚洲第一区在线| 国产黄a三级三级三级av在线看| 精品视频www| 精品国产无码一区二区| 欧美亚洲一区二区在线| 久久夜色精品亚洲| 一区二区成人在线观看| 精品一区二区在线观看视频| 久久免费美女视频| 图片区偷拍区小说区| 久草热8精品视频在线观看| 91九色在线观看视频| 中文av一区| 亚洲一区二区在线观| 亚洲一区二区在线播放| 国产第一精品| 日韩美女写真福利在线观看| а√天堂中文在线资源8| 欧美成人免费小视频| 成年人视频免费在线观看| 日韩成人在线视频网站| 黑人乱码一区二区三区av| 91精品国产综合久久精品麻豆 | 天堂影院一区二区| 熟女少妇在线视频播放| 国内精品福利| 4444亚洲人成无码网在线观看| 久久国产电影| 亚洲欧洲精品一区二区| 国产a久久精品一区二区三区| 精品国产一区二区三区四区vr | 青青影院一区二区三区四区| 午夜精品影视国产一区在线麻豆| 国产精品毛片va一区二区三区| 日本精品在线观看| 91黄在线观看| 亚洲不卡在线| 波多野结衣久草一区| 日本免费一区二区三区视频| 亚洲专区中文字幕| 日本精品在线观看| dy888夜精品国产专区| 综合激情久久| 成人动漫在线视频| 丁香综合av| 国产伦精品一区二区三区高清| 懂色av一区二区| 精品免费国产| 国产一区2区| 一区二区三区国产福利| 欧美黄色大片在线观看| 在线观看免费黄色片| 欧美91视频| 国产精品入口芒果| 国产精品入口| 国产a级片免费观看| 日本美女一区二区三区视频| 五月天开心婷婷| 国产一级精品在线| 无码人妻精品一区二区三| 99久久婷婷国产| 天天躁日日躁aaaa视频| 中文字幕制服丝袜一区二区三区 | 欧美亚洲动漫另类| 一级黄色免费片| 日韩欧美中文字幕精品| 人妻视频一区二区三区| 亚洲欧美国产精品va在线观看| 成全电影播放在线观看国语| 麻豆国产va免费精品高清在线| 欧美卡一卡二| 日本精品久久久| 日韩三级成人| 国产亚洲精品美女久久久m| 国产成人三级| 精品免费久久久久久久| 久热re这里精品视频在线6| 成人av毛片在线观看| 成人国产精品免费观看动漫| 日本一区二区视频在线播放| 亚洲精品水蜜桃| 日日夜夜狠狠操| 日韩亚洲欧美中文三级| 欧美视频综合| 欧美成人激情在线| jk漫画禁漫成人入口| 91在线观看欧美日韩| 免费成人蒂法| 日本福利视频导航| 亚洲一区国产一区| 亚洲一区二区中文字幕在线观看| 99re视频精品| 天天看片中文字幕| 在线观看成人小视频| 亚洲黄色在线观看视频| 中文字幕日韩电影| a天堂资源在线| 91在线视频一区| 美女久久99| 日本熟妇人妻xxxx| 久久精品99国产国产精| 久久丫精品国产亚洲av不卡| 亚洲国产日韩a在线播放| 亚洲视频一区在线播放| 国产视频在线观看一区二区| 综合久久2019| 国产精品一区二区三区毛片淫片| 欧美美女啪啪| 欧妇女乱妇女乱视频| 美女www一区二区| 精品人妻无码一区二区三区| 亚洲一区二区精品视频| 国产精品爽爽久久| 一区二区三区动漫| 综合另类专区| 九色综合日本| 影音先锋国产精品| 精品国产午夜福利在线观看| 国产精品久久二区二区| 欧美三级网站在线观看| 精品在线观看国产| 极品av在线| 国产欧美日韩伦理| 欧美私人啪啪vps| 精品国产午夜福利在线观看| 亚洲三级视频在线观看| 又污又黄的网站| 色噜噜狠狠狠综合曰曰曰| 成人免费一区| 天堂av一区二区| 日本免费在线视频不卡一不卡二| 公肉吊粗大爽色翁浪妇视频| 日韩欧美精品中文字幕| 欧美成人片在线| 清纯唯美亚洲综合| 亚洲黄页在线观看| 国产aaa一级片| 国产亚洲欧美激情| 中文字幕免费在线观看视频| 精品伊人久久97| 欧美一级二级视频| 午夜精品一区二区在线观看的| 日韩av不卡在线观看| 日韩不卡av在线| 欧美日韩午夜在线| 成人日日夜夜| 99一区二区三区| 伊人久久综合| 成年人网站免费在线观看| 色欧美88888久久久久久影院| 久久天堂电影| 国产主播在线一区| 欧美精选一区| av无码一区二区三区| 色综合久久久久综合体| av网站在线播放| 91久久久久久| 宅男噜噜噜66国产日韩在线观看| 无码国产69精品久久久久同性| 在线免费av一区| 91网址在线观看| 精品日韩美女| 日本欧美一区二区三区乱码 | 你懂的免费在线观看视频网站| 国产不卡av在线| 国产精品久久久久久久| 日韩高清一二三区| 欧美日韩在线视频观看| 在线播放日本| 99c视频在线| 麻豆精品网站| 中文字幕影音先锋| 日韩精品视频三区| 亚洲欧洲一二区| 日韩a∨精品日韩在线观看| 国产亚洲精品精华液| 国产精品羞羞答答在线| 午夜精品蜜臀一区二区三区免费| av资源久久| 精品人妻在线视频| 在线免费av一区| 手机av免费在线| 日本在线成人一区二区| 国产激情一区二区三区| 无码aⅴ精品一区二区三区| 久久中文精品视频| 九九热爱视频精品视频| 欧美xxxx黑人| 欧美在线观看视频在线| 黄页在线观看免费| 亚洲视频精品一区| 91色婷婷久久久久合中文|