色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Java實(shí)現(xiàn)MySQL到Excel高效導(dǎo)出與導(dǎo)入:POI與EasyExcel實(shí)戰(zhàn)

Java實(shí)現(xiàn)MySQL到Excel高效導(dǎo)出與導(dǎo)入:POI與EasyExcel實(shí)戰(zhàn) 1. 為什么“數(shù)據(jù)庫(kù)到Excel”這個(gè)需求值得認(rèn)真對(duì)待但凡做過(guò)企業(yè)級(jí)應(yīng)用的人幾乎都繞不開(kāi)一個(gè)場(chǎng)景業(yè)務(wù)方跑過(guò)來(lái)說(shuō)“能不能把系統(tǒng)里的數(shù)據(jù)導(dǎo)出來(lái)給我我要在Excel里做分析”?;蛘叻催^(guò)來(lái)“我這邊整理了一份Excel能不能批量導(dǎo)入到系統(tǒng)里”。這個(gè)需求聽(tīng)起來(lái)簡(jiǎn)單得不像個(gè)技術(shù)問(wèn)題但真正動(dòng)過(guò)手的人都知道從MySQL到Excel的導(dǎo)出與導(dǎo)入坑遠(yuǎn)比想象中多。我做過(guò)不少類似的項(xiàng)目從最早用JDBC拼字符串生成CSV到后來(lái)用POI直接寫(xiě)xlsx再到用EasyExcel處理百萬(wàn)行級(jí)別的數(shù)據(jù)每一次都在踩坑中積累經(jīng)驗(yàn)。這篇文章就把我這些年在這個(gè)場(chǎng)景下積累的東西完整梳理一遍從方案選型、核心實(shí)現(xiàn)、性能優(yōu)化到常見(jiàn)問(wèn)題排查盡量做到你拿著就能用。先說(shuō)清楚這個(gè)內(nèi)容適合誰(shuí)看如果你是一個(gè)Java后端開(kāi)發(fā)者手頭有MySQL數(shù)據(jù)庫(kù)需要實(shí)現(xiàn)數(shù)據(jù)的Excel導(dǎo)出和導(dǎo)入功能不管你是剛?cè)胄械男率诌€是有一定經(jīng)驗(yàn)的工程師這篇文章都能給你提供可直接參考的方案。我會(huì)從最基礎(chǔ)的實(shí)現(xiàn)講起逐步深入到性能優(yōu)化和異常處理中間會(huì)穿插大量實(shí)際項(xiàng)目中總結(jié)的經(jīng)驗(yàn)和注意事項(xiàng)。核心關(guān)鍵詞就幾個(gè)Java、MySQL、Excel、導(dǎo)出、導(dǎo)入、Apache POI、EasyExcel。這些詞會(huì)貫穿全文但我不會(huì)為了堆砌而堆砌每個(gè)技術(shù)點(diǎn)的出現(xiàn)都是因?yàn)閷?shí)際需要。2. 方案選型用什么庫(kù)、走什么路線2.1 主流Excel處理庫(kù)對(duì)比Java生態(tài)里處理Excel的庫(kù)不算多主流的就是那么幾個(gè)。我整理了一個(gè)對(duì)比表格方便你根據(jù)自己項(xiàng)目的實(shí)際情況做選擇庫(kù)名稱優(yōu)勢(shì)劣勢(shì)適用場(chǎng)景Apache POI功能最全支持xls和xlsx社區(qū)成熟API偏底層代碼量大內(nèi)存占用高復(fù)雜格式、圖表、公式等高級(jí)需求EasyExcelAPI簡(jiǎn)潔內(nèi)存占用低適合大數(shù)據(jù)量功能相對(duì)POI少一些復(fù)雜格式支持有限大數(shù)據(jù)量導(dǎo)入導(dǎo)出格式要求不極端JXL輕量API簡(jiǎn)單只支持xls已停止維護(hù)老項(xiàng)目維護(hù)新項(xiàng)目不推薦CSV方案極簡(jiǎn)無(wú)依賴性能最好不支持格式、多sheet編碼問(wèn)題多純數(shù)據(jù)交換無(wú)格式要求我個(gè)人的選擇邏輯是這樣的如果數(shù)據(jù)量在10萬(wàn)行以內(nèi)格式要求不高直接用EasyExcel如果數(shù)據(jù)量超過(guò)50萬(wàn)行優(yōu)先考慮EasyExcel的流式處理或者CSV方案如果業(yè)務(wù)方要求復(fù)雜的表頭合并、單元格樣式、公式計(jì)算那就老老實(shí)實(shí)用Apache POI。這里要特別說(shuō)一個(gè)誤區(qū)很多人覺(jué)得POI性能差就完全不用其實(shí)POI的SXSSF模式流式寫(xiě)入在處理大數(shù)據(jù)量時(shí)表現(xiàn)也不差只是API用起來(lái)確實(shí)比EasyExcel啰嗦不少。2.2 導(dǎo)出方案的核心考量導(dǎo)出這個(gè)方向核心要解決的問(wèn)題就三個(gè)數(shù)據(jù)量、格式要求、響應(yīng)方式。數(shù)據(jù)量決定了你用哪種寫(xiě)入模式。POI的XSSF模式是把整個(gè)工作簿放在內(nèi)存里10萬(wàn)行以上就可能OOMSXSSF模式是流式寫(xiě)入只在內(nèi)存里保留一定行數(shù)默認(rèn)100行適合百萬(wàn)級(jí)數(shù)據(jù)。EasyExcel底層也是基于流式寫(xiě)入的思路但封裝得更好用。格式要求決定了你選哪個(gè)庫(kù)。如果只是簡(jiǎn)單的表頭加數(shù)據(jù)行EasyExcel足夠如果需要合并單元格、設(shè)置條件格式、插入圖片那POI是唯一選擇。響應(yīng)方式?jīng)Q定了你的接口設(shè)計(jì)。如果是同步導(dǎo)出用戶點(diǎn)擊按鈕后等待文件生成然后下載那要注意HTTP超時(shí)和內(nèi)存控制如果是異步導(dǎo)出生成文件后存到文件服務(wù)器再通知用戶下載那要考慮文件清理和并發(fā)控制。2.3 導(dǎo)入方案的核心考量導(dǎo)入比導(dǎo)出更復(fù)雜因?yàn)槟阋幚碛脩糨斎氲牟淮_定性。用戶可能傳一個(gè)空文件、可能傳一個(gè)格式不對(duì)的文件、可能傳一個(gè)列順序亂掉的文件、可能傳一個(gè)包含非法字符的文件。導(dǎo)入功能的核心不是“讀Excel”而是“校驗(yàn)和容錯(cuò)”。我的經(jīng)驗(yàn)是導(dǎo)入功能至少要考慮以下幾層校驗(yàn)文件格式校驗(yàn)是不是xlsx/xls、文件大小校驗(yàn)防止惡意大文件、表頭校驗(yàn)列名和順序是否匹配、數(shù)據(jù)類型校驗(yàn)數(shù)字列是不是數(shù)字、業(yè)務(wù)規(guī)則校驗(yàn)必填項(xiàng)、唯一性、關(guān)聯(lián)關(guān)系。每一層校驗(yàn)都要給用戶明確的錯(cuò)誤提示最好能定位到具體是哪一行哪一列出了問(wèn)題。3. 從MySQL導(dǎo)出到Excel的完整實(shí)現(xiàn)3.1 環(huán)境準(zhǔn)備與依賴引入先假設(shè)你用的是Maven項(xiàng)目需要引入的依賴如下。這里我同時(shí)給出POI和EasyExcel的依賴你可以根據(jù)實(shí)際選型決定用哪個(gè)!-- Apache POI 核心依賴 -- dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version5.2.3/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version5.2.3/version /dependency !-- EasyExcel 依賴 -- dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.3.2/version /dependency !-- MySQL 驅(qū)動(dòng) -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency注意POI 5.x版本和4.x版本在API上有一些差異網(wǎng)上很多老教程用的是4.x的寫(xiě)法直接復(fù)制可能會(huì)編譯報(bào)錯(cuò)。建議統(tǒng)一用5.x版本API更穩(wěn)定。數(shù)據(jù)庫(kù)連接池我推薦用HikariCPSpring Boot項(xiàng)目默認(rèn)就是它這里不展開(kāi)。關(guān)鍵是要確保你的數(shù)據(jù)源配置里fetchSize設(shè)置合理導(dǎo)出大數(shù)據(jù)量時(shí)這個(gè)參數(shù)直接影響內(nèi)存占用。3.2 基于POI的導(dǎo)出實(shí)現(xiàn)先看一個(gè)最基礎(chǔ)的POI導(dǎo)出實(shí)現(xiàn)把MySQL中的一張表導(dǎo)出為xlsx文件。假設(shè)我們有一張用戶表字段包括id、name、email、create_timepublic void exportWithPoi(Connection conn, String outputPath) throws Exception { String sql SELECT id, name, email, create_time FROM user; try (PreparedStatement ps conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) { // 關(guān)鍵設(shè)置流式讀取結(jié)果集避免一次性加載所有數(shù)據(jù)到內(nèi)存 ps.setFetchSize(Integer.MIN_VALUE); // MySQL驅(qū)動(dòng)需要設(shè)置為流式模式 ps conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setFetchSize(Integer.MIN_VALUE); try (ResultSet rs ps.executeQuery(); SXSSFWorkbook workbook new SXSSFWorkbook(100)) { // 內(nèi)存中保留100行 Sheet sheet workbook.createSheet(用戶數(shù)據(jù)); // 創(chuàng)建表頭 Row headerRow sheet.createRow(0); String[] headers {ID, 姓名, 郵箱, 創(chuàng)建時(shí)間}; for (int i 0; i headers.length; i) { Cell cell headerRow.createCell(i); cell.setCellValue(headers[i]); } // 填充數(shù)據(jù) int rowIndex 1; while (rs.next()) { Row row sheet.createRow(rowIndex); row.createCell(0).setCellValue(rs.getLong(id)); row.createCell(1).setCellValue(rs.getString(name)); row.createCell(2).setCellValue(rs.getString(email)); Timestamp ts rs.getTimestamp(create_time); if (ts ! null) { row.createCell(3).setCellValue( new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(ts)); } } // 寫(xiě)入文件 try (FileOutputStream fos new FileOutputStream(outputPath)) { workbook.write(fos); } // 清理臨時(shí)文件 workbook.dispose(); } } }這段代碼有幾個(gè)關(guān)鍵點(diǎn)需要解釋。第一SXSSFWorkbook的構(gòu)造參數(shù)100表示內(nèi)存中只保留100行數(shù)據(jù)超出的部分會(huì)寫(xiě)入臨時(shí)文件這樣即使導(dǎo)出100萬(wàn)行也不會(huì)OOM。第二ps.setFetchSize(Integer.MIN_VALUE)是MySQL驅(qū)動(dòng)特有的流式讀取設(shè)置不加這個(gè)的話驅(qū)動(dòng)會(huì)一次性把所有結(jié)果集加載到內(nèi)存數(shù)據(jù)量大時(shí)同樣會(huì)OOM。第三workbook.dispose()一定要調(diào)用否則臨時(shí)文件不會(huì)被清理磁盤(pán)空間會(huì)被慢慢吃掉。3.3 基于EasyExcel的導(dǎo)出實(shí)現(xiàn)同樣的需求用EasyExcel來(lái)實(shí)現(xiàn)會(huì)簡(jiǎn)潔很多。先定義一個(gè)數(shù)據(jù)對(duì)象Data public class UserExcelDTO { ExcelProperty(ID) private Long id; ExcelProperty(姓名) private String name; ExcelProperty(郵箱) private String email; ExcelProperty(創(chuàng)建時(shí)間) DateTimeFormat(yyyy-MM-dd HH:mm:ss) private Date createTime; }然后導(dǎo)出邏輯public void exportWithEasyExcel(Connection conn, String outputPath) throws Exception { String sql SELECT id, name, email, create_time FROM user; try (PreparedStatement ps conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) { ps.setFetchSize(Integer.MIN_VALUE); try (ResultSet rs ps.executeQuery()) { // 構(gòu)建數(shù)據(jù)列表實(shí)際項(xiàng)目中建議分批查詢避免一次性加載 ListUserExcelDTO dataList new ArrayList(); while (rs.next()) { UserExcelDTO dto new UserExcelDTO(); dto.setId(rs.getLong(id)); dto.setName(rs.getString(name)); dto.setEmail(rs.getString(email)); dto.setCreateTime(rs.getTimestamp(create_time)); dataList.add(dto); } EasyExcel.write(outputPath, UserExcelDTO.class) .sheet(用戶數(shù)據(jù)) .doWrite(dataList); } } }EasyExcel的代碼量明顯少很多而且ExcelProperty注解直接定義了表頭DateTimeFormat處理了日期格式化非常直觀。但要注意上面這種寫(xiě)法是把所有數(shù)據(jù)先加載到List里再寫(xiě)入數(shù)據(jù)量特別大時(shí)內(nèi)存會(huì)有壓力。EasyExcel也支持分批寫(xiě)入后面性能優(yōu)化部分會(huì)講。3.4 導(dǎo)出功能的接口設(shè)計(jì)實(shí)際項(xiàng)目中導(dǎo)出通常是一個(gè)HTTP接口。這里給出一個(gè)Spring Boot的Controller示例GetMapping(/export/users) public void exportUsers(HttpServletResponse response) throws IOException { response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setCharacterEncoding(utf-8); String fileName URLEncoder.encode(用戶數(shù)據(jù), UTF-8).replaceAll(\\, %20); response.setHeader(Content-Disposition, attachment;filename*utf-8 fileName .xlsx); // 使用EasyExcel直接寫(xiě)入response的輸出流 EasyExcel.write(response.getOutputStream(), UserExcelDTO.class) .sheet(用戶數(shù)據(jù)) .doWrite(queryUserList()); }提示文件名一定要做URL編碼否則中文文件名在部分瀏覽器上會(huì)亂碼。filename*utf-8這種寫(xiě)法是RFC 5987規(guī)定的兼容性最好。4. 從Excel導(dǎo)入到MySQL的完整實(shí)現(xiàn)4.1 導(dǎo)入功能的設(shè)計(jì)思路導(dǎo)入功能我一般會(huì)拆成三個(gè)階段解析階段、校驗(yàn)階段、入庫(kù)階段。解析階段負(fù)責(zé)把Excel文件讀成Java對(duì)象列表校驗(yàn)階段負(fù)責(zé)檢查數(shù)據(jù)的合法性入庫(kù)階段負(fù)責(zé)批量寫(xiě)入數(shù)據(jù)庫(kù)。這三個(gè)階段分開(kāi)的好處是每個(gè)階段都可以獨(dú)立處理異常給用戶精確的錯(cuò)誤反饋。解析階段用EasyExcel的監(jiān)聽(tīng)器模式是最合適的因?yàn)樗С种鹦凶x取不需要一次性加載整個(gè)文件。校驗(yàn)階段可以定義一個(gè)校驗(yàn)器接口針對(duì)不同的業(yè)務(wù)規(guī)則實(shí)現(xiàn)不同的校驗(yàn)邏輯。入庫(kù)階段用JDBC的批量插入配合事務(wù)控制。4.2 基于EasyExcel的導(dǎo)入實(shí)現(xiàn)先定義一個(gè)導(dǎo)入用的監(jiān)聽(tīng)器public class UserImportListener extends AnalysisEventListenerUserExcelDTO { private static final int BATCH_SIZE 500; private ListUserExcelDTO batchList new ArrayList(BATCH_SIZE); private ListString errorMessages new ArrayList(); private int rowIndex 1; // 從第2行開(kāi)始是數(shù)據(jù)第1行是表頭 private UserService userService; public UserImportListener(UserService userService) { this.userService userService; } Override public void invoke(UserExcelDTO data, AnalysisContext context) { rowIndex; // 單行校驗(yàn) String error validateRow(data); if (error ! null) { errorMessages.add(第 rowIndex 行 error); return; } batchList.add(data); // 達(dá)到批次大小就入庫(kù) if (batchList.size() BATCH_SIZE) { saveBatch(); } } Override public void doAfterAllAnalysed(AnalysisContext context) { // 處理最后一批 if (!batchList.isEmpty()) { saveBatch(); } } private void saveBatch() { try { userService.batchInsert(batchList); } catch (Exception e) { errorMessages.add(批次入庫(kù)失敗 e.getMessage()); } batchList.clear(); } private String validateRow(UserExcelDTO data) { if (data.getName() null || data.getName().trim().isEmpty()) { return 姓名不能為空; } if (data.getEmail() null || !data.getEmail().matches(^[\\w.-][\\w.-]\\.[a-zA-Z]{2,}$)) { return 郵箱格式不正確; } return null; } public ListString getErrorMessages() { return errorMessages; } }調(diào)用方式public ImportResult importUsers(MultipartFile file) throws IOException { UserImportListener listener new UserImportListener(userService); EasyExcel.read(file.getInputStream(), UserExcelDTO.class, listener) .sheet() .doRead(); ImportResult result new ImportResult(); result.setSuccessCount(/* 成功條數(shù) */); result.setErrorMessages(listener.getErrorMessages()); return result; }這個(gè)實(shí)現(xiàn)有幾個(gè)值得注意的地方。第一BATCH_SIZE設(shè)為500是一個(gè)經(jīng)驗(yàn)值太小會(huì)導(dǎo)致頻繁的數(shù)據(jù)庫(kù)交互太大會(huì)占用過(guò)多內(nèi)存500到1000之間比較合適。第二錯(cuò)誤信息記錄了具體的行號(hào)用戶拿到反饋后可以直接定位到Excel中的問(wèn)題行。第三doAfterAllAnalysed方法里處理最后一批數(shù)據(jù)這個(gè)容易被遺漏。4.3 批量入庫(kù)的SQL優(yōu)化批量插入的性能差異非常大我做過(guò)測(cè)試逐條插入和批量插入在1萬(wàn)條數(shù)據(jù)上的耗時(shí)差距可以達(dá)到幾十倍。下面是批量插入的示例public void batchInsert(ListUserExcelDTO list) { String sql INSERT INTO user (name, email, create_time) VALUES (?, ?, ?); try (Connection conn dataSource.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { conn.setAutoCommit(false); for (UserExcelDTO dto : list) { ps.setString(1, dto.getName()); ps.setString(2, dto.getEmail()); ps.setTimestamp(3, new Timestamp(dto.getCreateTime().getTime())); ps.addBatch(); } ps.executeBatch(); conn.commit(); } catch (SQLException e) { // 異常處理 } }注意MySQL的JDBC連接URL上要加上rewriteBatchedStatementstrue參數(shù)否則addBatch()和executeBatch()不會(huì)真正合并成一條SQL性能提升非常有限。這個(gè)參數(shù)是MySQL驅(qū)動(dòng)特有的優(yōu)化開(kāi)關(guān)很多人不知道。4.4 導(dǎo)入功能的容錯(cuò)設(shè)計(jì)導(dǎo)入功能最怕的就是用戶傳了一個(gè)亂七八糟的文件然后系統(tǒng)拋出一堆看不懂的異常。我的做法是在解析之前先做一輪文件級(jí)別的校驗(yàn)public void validateFile(MultipartFile file) { if (file.isEmpty()) { throw new BusinessException(文件不能為空); } String fileName file.getOriginalFilename(); if (fileName null || (!fileName.endsWith(.xlsx) !fileName.endsWith(.xls))) { throw new BusinessException(只支持xlsx和xls格式的文件); } if (file.getSize() 10 * 1024 * 1024) { throw new BusinessException(文件大小不能超過(guò)10MB); } }然后在解析過(guò)程中對(duì)于格式錯(cuò)誤、類型轉(zhuǎn)換失敗等異常EasyExcel會(huì)拋出ExcelAnalysisException需要捕獲并轉(zhuǎn)換成用戶能理解的提示。我一般會(huì)自定義一個(gè)異常處理器EasyExcel.read(inputStream, UserExcelDTO.class, listener) .registerConverter(new CustomStringConverter()) .sheet() .doRead();自定義Converter可以處理一些特殊的數(shù)據(jù)轉(zhuǎn)換場(chǎng)景比如把Excel中的“是/否”轉(zhuǎn)換成Java的Boolean或者把“2024/1/1”這種非標(biāo)準(zhǔn)日期格式解析成Date對(duì)象。5. 性能優(yōu)化與大數(shù)據(jù)量處理5.1 導(dǎo)出性能優(yōu)化的幾個(gè)關(guān)鍵點(diǎn)大數(shù)據(jù)量導(dǎo)出核心就一個(gè)字流。從數(shù)據(jù)庫(kù)查詢到Excel寫(xiě)入整條鏈路都要做到流式處理不能在任何環(huán)節(jié)把全量數(shù)據(jù)加載到內(nèi)存。數(shù)據(jù)庫(kù)層面前面提到的setFetchSize(Integer.MIN_VALUE)是必須的。但這里有個(gè)坑MySQL驅(qū)動(dòng)在流式讀取模式下同一個(gè)連接不能同時(shí)執(zhí)行其他查詢否則會(huì)報(bào)“Streaming result set is still active”的錯(cuò)誤。所以導(dǎo)出操作最好使用獨(dú)立的數(shù)據(jù)庫(kù)連接不要和業(yè)務(wù)查詢共用。Excel寫(xiě)入層面POI的SXSSF模式已經(jīng)做了流式處理但要注意SXSSFWorkbook的構(gòu)造參數(shù)不要設(shè)得太大100到1000之間比較合適。設(shè)得太大內(nèi)存占用高設(shè)得太小臨時(shí)文件IO頻繁。還有一個(gè)容易被忽略的點(diǎn)是單元格樣式的創(chuàng)建。POI中每創(chuàng)建一個(gè)CellStyle都會(huì)占用內(nèi)存如果每行都創(chuàng)建新樣式數(shù)據(jù)量大時(shí)內(nèi)存會(huì)暴漲。正確的做法是把樣式創(chuàng)建在循環(huán)外面所有行復(fù)用同一個(gè)樣式對(duì)象CellStyle style workbook.createCellStyle(); Font font workbook.createFont(); font.setBold(true); style.setFont(font); // 在循環(huán)外面創(chuàng)建循環(huán)里面復(fù)用 for (int i 0; i headers.length; i) { Cell cell headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(style); // 復(fù)用樣式 }5.2 導(dǎo)入性能優(yōu)化的幾個(gè)關(guān)鍵點(diǎn)導(dǎo)入的性能瓶頸通常在數(shù)據(jù)庫(kù)寫(xiě)入上。除了前面說(shuō)的批量插入和rewriteBatchedStatementstrue還有幾個(gè)優(yōu)化點(diǎn)第一關(guān)閉自動(dòng)提交。每次executeBatch()之前手動(dòng)setAutoCommit(false)批量執(zhí)行完再commit()可以減少事務(wù)開(kāi)銷。第二合理設(shè)置批次大小。我實(shí)測(cè)下來(lái)500到1000條一批比較均衡。批次太小數(shù)據(jù)庫(kù)交互頻繁批次太大內(nèi)存占用高且單次事務(wù)時(shí)間長(zhǎng)。第三使用多線程解析。EasyExcel支持多線程讀取但要注意線程安全問(wèn)題。如果業(yè)務(wù)允許可以把Excel按行拆分成多個(gè)片段用線程池并行解析和入庫(kù)。不過(guò)這個(gè)方案實(shí)現(xiàn)復(fù)雜度較高數(shù)據(jù)量不是特別大的話沒(méi)必要。第四數(shù)據(jù)庫(kù)連接池配置。導(dǎo)入操作會(huì)占用數(shù)據(jù)庫(kù)連接較長(zhǎng)時(shí)間連接池的maxPoolSize要設(shè)置合理避免導(dǎo)入操作把連接池占滿導(dǎo)致其他業(yè)務(wù)請(qǐng)求無(wú)法處理。5.3 內(nèi)存監(jiān)控與OOM預(yù)防大數(shù)據(jù)量導(dǎo)出最容易出的問(wèn)題就是OOM。除了用流式處理還建議在代碼里加一些內(nèi)存監(jiān)控的邏輯Runtime runtime Runtime.getRuntime(); long usedMemory runtime.totalMemory() - runtime.freeMemory(); if (usedMemory runtime.maxMemory() * 0.8) { // 內(nèi)存使用超過(guò)80%觸發(fā)GC或者暫停處理 System.gc(); // 如果還是高考慮分批處理或者拋出提示 }當(dāng)然System.gc()只是建議JVM執(zhí)行GC不保證立即執(zhí)行。更可靠的做法是在JVM啟動(dòng)參數(shù)里設(shè)置合理的堆大小和GC策略比如-Xmx2g -Xms2g -XX:UseG1GC。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄6.1 導(dǎo)出常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因解決方案導(dǎo)出文件打不開(kāi)提示損壞輸出流未正確關(guān)閉或?qū)懭氩煌暾_保workbook.write()后正確關(guān)閉流使用try-with-resources中文文件名亂碼未做URL編碼使用URLEncoder.encode()并設(shè)置正確的Content-Disposition導(dǎo)出數(shù)據(jù)量大了就OOM使用了XSSFWorkbook或未設(shè)置fetchSize改用SXSSFWorkbook設(shè)置setFetchSize(Integer.MIN_VALUE)日期格式不對(duì)未設(shè)置日期格式或時(shí)區(qū)問(wèn)題使用DateTimeFormat注解或手動(dòng)SimpleDateFormat導(dǎo)出速度特別慢逐條查詢數(shù)據(jù)庫(kù)或頻繁創(chuàng)建樣式批量查詢樣式復(fù)用使用流式寫(xiě)入數(shù)字變成了科學(xué)計(jì)數(shù)法Excel自動(dòng)格式化設(shè)置單元格格式為文本或使用BigDecimal并設(shè)置DataFormat6.2 導(dǎo)入常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因解決方案讀取不到數(shù)據(jù)表頭行號(hào)設(shè)置錯(cuò)誤檢查headRowNumber參數(shù)默認(rèn)是1日期解析失敗Excel中的日期格式不標(biāo)準(zhǔn)自定義Converter處理多種日期格式數(shù)字精度丟失Excel中數(shù)字被存為double使用String接收再轉(zhuǎn)換或使用BigDecimal批量插入慢未開(kāi)啟rewriteBatchedStatementsJDBC URL添加該參數(shù)部分?jǐn)?shù)據(jù)入庫(kù)失敗未做事務(wù)控制使用事務(wù)失敗時(shí)回滾或記錄錯(cuò)誤行內(nèi)存溢出一次性讀取所有數(shù)據(jù)使用監(jiān)聽(tīng)器模式逐行讀取分批入庫(kù)6.3 幾個(gè)我踩過(guò)的坑第一個(gè)坑MySQL流式讀取的副作用。前面提到setFetchSize(Integer.MIN_VALUE)可以實(shí)現(xiàn)流式讀取但很多人不知道的是在流式讀取模式下如果結(jié)果集沒(méi)有讀完就關(guān)閉了StatementMySQL驅(qū)動(dòng)會(huì)拋出異常。所以一定要確保ResultSet被完整遍歷或者正確關(guān)閉。第二個(gè)坑EasyExcel的并發(fā)寫(xiě)入問(wèn)題。EasyExcel的doWrite()方法不是線程安全的如果多個(gè)線程同時(shí)往同一個(gè)文件寫(xiě)入會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂。如果確實(shí)需要并發(fā)導(dǎo)出每個(gè)線程應(yīng)該寫(xiě)入不同的文件最后再合并。第三個(gè)坑Excel的單元格類型判斷。用POI讀取Excel時(shí)cell.getCellType()返回的類型可能和預(yù)期不一致。比如用戶輸入的數(shù)字“123”Excel可能存為NUMERIC類型也可能存為STRING類型。穩(wěn)妥的做法是用DataFormatter來(lái)統(tǒng)一處理DataFormatter formatter new DataFormatter(); String value formatter.formatCellValue(cell);第四個(gè)坑大文件導(dǎo)入時(shí)的超時(shí)問(wèn)題。如果導(dǎo)入的文件很大HTTP請(qǐng)求可能會(huì)超時(shí)。解決方案是把導(dǎo)入操作改成異步的用戶上傳文件后立即返回一個(gè)任務(wù)ID后臺(tái)異步處理用戶通過(guò)任務(wù)ID查詢進(jìn)度和結(jié)果。第五個(gè)坑Excel中的空行處理。用戶可能在數(shù)據(jù)末尾留了很多空行EasyExcel默認(rèn)會(huì)跳過(guò)完全空白的行但如果空行中有格式比如邊框就可能被當(dāng)成有效數(shù)據(jù)。建議在監(jiān)聽(tīng)器的invoke()方法里加一個(gè)判斷如果所有字段都為空就跳過(guò)。7. 一些進(jìn)階思路與擴(kuò)展方向7.1 動(dòng)態(tài)表頭與多Sheet導(dǎo)出實(shí)際項(xiàng)目中經(jīng)常遇到需要?jiǎng)討B(tài)生成表頭的場(chǎng)景比如用戶可以選擇導(dǎo)出哪些字段。EasyExcel支持動(dòng)態(tài)表頭ListListString head new ArrayList(); head.add(Collections.singletonList(ID)); head.add(Collections.singletonList(姓名)); // 根據(jù)用戶選擇動(dòng)態(tài)添加 EasyExcel.write(outputPath) .head(head) .sheet(數(shù)據(jù)) .doWrite(dataList);多Sheet導(dǎo)出也很簡(jiǎn)單多次調(diào)用sheet()方法即可ExcelWriter writer EasyExcel.write(outputPath).build(); WriteSheet sheet1 EasyExcel.writerSheet(0, 用戶數(shù)據(jù)).head(UserExcelDTO.class).build(); WriteSheet sheet2 EasyExcel.writerSheet(1, 訂單數(shù)據(jù)).head(OrderExcelDTO.class).build(); writer.write(userList, sheet1); writer.write(orderList, sheet2); writer.finish();7.2 導(dǎo)入時(shí)的數(shù)據(jù)去重與更新策略導(dǎo)入數(shù)據(jù)時(shí)經(jīng)常需要處理“已存在的數(shù)據(jù)是更新還是跳過(guò)”的問(wèn)題。我的做法是在校驗(yàn)階段查詢數(shù)據(jù)庫(kù)根據(jù)業(yè)務(wù)主鍵判斷數(shù)據(jù)是否已存在然后分別走插入或更新邏輯。批量場(chǎng)景下可以先把所有主鍵查出來(lái)放到一個(gè)Set里避免逐條查詢數(shù)據(jù)庫(kù)。7.3 導(dǎo)出文件的存儲(chǔ)與清理如果是異步導(dǎo)出生成的文件需要臨時(shí)存儲(chǔ)。我一般會(huì)在服務(wù)器上建一個(gè)臨時(shí)目錄文件名用UUID避免沖突然后設(shè)置一個(gè)定時(shí)任務(wù)定期清理超過(guò)24小時(shí)的文件。如果文件比較大還可以考慮壓縮后再提供下載。8. 個(gè)人經(jīng)驗(yàn)總結(jié)做了這么多導(dǎo)出導(dǎo)入的功能我最大的體會(huì)是這個(gè)看似簡(jiǎn)單的需求實(shí)際上考驗(yàn)的是你對(duì)整個(gè)數(shù)據(jù)鏈路的掌控能力。從數(shù)據(jù)庫(kù)查詢、內(nèi)存管理、Excel寫(xiě)入、HTTP響應(yīng)到異常處理每一個(gè)環(huán)節(jié)都可能出問(wèn)題。如果讓我給新手一個(gè)建議那就是先用最簡(jiǎn)單的方案把功能跑通然后再根據(jù)實(shí)際的數(shù)據(jù)量和性能要求逐步優(yōu)化。不要一上來(lái)就追求完美方案很多時(shí)候業(yè)務(wù)方的數(shù)據(jù)量根本沒(méi)那么大過(guò)度設(shè)計(jì)反而增加了維護(hù)成本。另外導(dǎo)入功能的錯(cuò)誤提示一定要做得足夠友好。用戶傳了一個(gè)有問(wèn)題的文件你要告訴他具體是哪一行哪一列出了什么問(wèn)題而不是拋一個(gè)“系統(tǒng)異?!本屯晔铝?。這一點(diǎn)在實(shí)際項(xiàng)目中得到的正面反饋?zhàn)疃嘁彩亲钊菀妆婚_(kāi)發(fā)者忽略的地方。最后分享一個(gè)小技巧在導(dǎo)出功能的測(cè)試階段可以用LIMIT子句限制查詢條數(shù)先驗(yàn)證格式和邏輯是否正確確認(rèn)無(wú)誤后再去掉限制做全量導(dǎo)出。這樣可以避免每次測(cè)試都等待大量數(shù)據(jù)查詢和寫(xiě)入的時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月天婷婷久久| 超碰碰碰碰| 色噜噜精品一区二区三| 91丝袜美女国产| 日本不卡高清免v欧美日韩在线观看| 亚洲 欧美 另类 综合 偷拍| 亚洲欧洲小说图片视频| 国产91精品久久久久久久网曝门| 人妻素股| 97综合在线| 天堂俺去俺来也www久久婷婷| 两性色网| 国产玖玖| ...日韩成人一区二区三区字幕| 中出91视频| 91精品国产91久久青草| 蜜乳av一区二区| 屁屁影院一区二区三区国产| 亚洲日本韩国极品一区二区| 日韩精品三级片长长久久| 欧美桃色网| 人人爱人人乐人人操| 国产一区在线观看无码AV| 一区二区三区免费岛国片| 国产欧美亚洲精品a第2页| 丝袜美腿诱惑亚洲欧美视频在线观看| 精品无码一区二区| 久久婷婷一区| 乱伦1色页| 猛交交| 久久久9品一区二区三区| 蘋果手機免費看成人Av| 99999国产| 成人av性爱电影在线观看| 久久性爱城| 长长久久88视频| 999 久久久| 天天综合欧美| 无码不卡亚洲成?人片| 床戏久久久av一区二区麻豆| 性爱视频久久| 啊啊啊好大好湿| 另类欧美色| 成年人黄色小视频网站| 天天综合网91入口| 亚洲国产精品成人久久蜜臀| 欧亚在线视频| 麻豆传媒一区二区在线观看| 17c嫩草51久久91嫩草| 自怕偷自怕亚洲精品| 天天爽天天干| 日本亚洲嫩草影院啪啪| 蜜乳av首页| 五月天久久婷婷亚洲 | 欧美性高潮在线| 亚欧毛片基地国产毛片基地| 欧插网站| 9.1小视频| 伊人久久大香线蕉无码| 精品无人区麻豆乱码久久久| 久九九九九九九九热| 亚洲精品人妻在线| 10000部十八禁看电影| 一本久道久久综合狠狠爱一密臀精| 亚洲砖码砖专无区2023| 青青草成人视频在线观看二区| 91免费看一区二区三区| 国产精品国产自产拍高清AV| 中文字幕一区二区三区人妻不卡 | 青久操| 男人的天堂2019| 久99热| 无码二级三级| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 三四中文字幕| 亚洲人妻一区二区三区| 人妻丝袜一区二区三区在线| 亚洲熟女国产综合另类| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 97爱爱爱综合| 亚洲 暴爽 AV人人爽日日碰| 亚洲欧美精品91| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 久久综合九色综合欧洲98| 97人人射| 五月天AV资源| 久久草在线综合视频| 黑人粗大V S日韩女优视频| 五月婷婷六月丁香网址| 久久久111| 91肉丝| 99色色网| 日本一二区不卡| 天堂蜜桃无码视频一区二区| 亚洲熟伦熟妇AV无码春色| 日韩AV中文字幕电影| 日韩一级二级在线| 国产日韩精品suv| 日本三级中国三级99人妇网站| 久久黄人人爽视频| 嗯啊啊啊轻点视频 | 中文字幕av片| 曰韩无码777| 人人妻天天做天天爽| 亚欧高清在线| 熟女人妻一区二区三区免费看| 色色色网站| 欧美,日韩,中文,另类| 日韩av乱伦| 99热这里都是精品| www四虎| 秋霞免费无码视频日韩A片| 性色国产东北露脸精品视频| 国产精品久久久久久 百度| 国产自偷| 99热99色| 久久大黄片| 亚州操操穴网| 国产一级特黄大片处女| 青青草国产一区二区三区| 中文字幕jul-617人妻熟女| 色噜噜狠狠色综无码久久合欧美| 骚逼一区二区| 亚洲熟女av日韩熟女| 超碰九区| 久久鲁夜| 久久青青草在线视频| 福利风月五月天影院| av天堂精品久久| 在线电影亚洲色图| 欧美久久九九| 日韩一级特黄av毛片| 日韩 欧美 国产 麻豆| 色情五月婷婷| 强奸乱伦免费网站| 精品视频一区二区| 草草影院在线视频| 国产高清成人mv在线观看| 哑洲在线| 天天看片麻豆| 猛交交| 精品久久无码午夜福利| 免费国产视频| 97超碰中文字幕| 蜜桃色色网站视频三区| 日韩亚洲精品一区二区| 午夜小电影在线插入淫高潮| 天天搞欧美| 九九热在线视频| 精品久久久av无码免费| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 一区二三区四区视频大全套| www.操| 国产三级中文有码在线视频| 丰满美女一级毛片在线播放| 最新制服中文第一页| 色欲人妻一区二区在线| 美女在线H91| 狠狠色综合网| 乳欲人妻办公室奶水| 97久久国产精品| 怡红院怡春院| 中日高清无码操逼视频| 国产精品熟女九色九色蜜臀| 男人天堂2019| 91在线丝袜视频| 久久人妻视频网| 国产精品视频一区二区三区八戒| 天天看精品动漫视频一区| 亚洲做性| 超碰97极品9| 五月天久久综合网| 欧美日韩啪啪电影| 开心六月色| 女人爽到高潮潮喷18禁网站| 人人搞人人插人人操| 青青欧洲黑| 色婷婷狠狠| 日本性爱不卡视频| 国产日逼视频| 久久精品国产精品一区| 舔足天天操天天射| 情色大香蕉| 天天日美女的B| 亚洲欧美中日韩| 99操视频| 任你艹| 国产精品色片一区二区| 天天色,天天干,天天干| 中文AV制服乱伦| 欧美不在线| 欧美 日韩第一性色| 久久久久久久久九九久孕交| 日韩免费人妻色情网站| 色色色热| 任你艹| 欧美亚洲日本激情在线| 久久精品三级影视| 日本www操操操| 亚州熟女乱伦| 肏逼视频日本| 欧美天天综合网| 男人天堂资源| 久久啊啊| 亚洲无码视频免费在线观看网址!| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲黄色影视| 日韩欧美一级特黄大片| 一级性爱视频免费在线| 人人操人人肉久久精品| 中文字幕欧美丝袜07资源| 福利视频网站| 老司机香蕉久久久久| 色97国产69香蕉| 9 1超碰九色| 在线亚洲丝袜视频网站| 激情四射婷婷六月天| 啊啊啊啊啊好舒服视频| 9999亚洲电影| 欧美黄色片AAAAA| 亚洲五码一区二区三区| 亚州综| a片在线播放| 九七超碰| 婷婷五月天社区| 99人人干| 久久99精品视频| 日本九九九九| 嗯嗯嗯好爽| 久热69九色熟妇97| 91伊人影视综合| 丰满少妇人妻久久久久久| 久久精彩视频9| 蜜臀AV一区二区三区激情综合| 成人五月香网在线| 国产综合久久久鬼色| 久久久久久久久九九久孕交| 国产精品久久久久久久久久久久久久久| 99久在线精品99re8a| 啊啊好多水| 久久大黄片| 九色黄站| 不卡一区二区日本视频| 国产麻豆一级精品视频| 欧美黑人猛交春色影视大全| 爱爱久久| 欧美,日韩,中文,另类| 国产精品96久久久久久| 国产乱伦性爱区| 2019天天干天天操| 大香蕉久| 亚洲婷婷五月天| 欧美人妻精品| 欧美 亚洲 另类 综合| av草草在线电影| 啊啊啊啊好疼| 久思思热视频在线观看| 91碰碰| 蜜桃久久久久久久| 激情黄色五月天| 欧美大色交| 日韩精品人妻一区二区| 日本一区二区三区午夜观看| 精品一区二区人妖| 久久久久ab| 久热网| 毛片一区二区| 91GD.COM| 九热大香蕉| 蜜桃网熟妇| 尤物av网站免费在线播放| 少妇一级婬片免费放一级a性色.| 热九九精品| 人人插人人摸人人| 国产欧美伊人| 国产精彩女在线观看视频| 久操免费观看| 日韩无码黄色片| 欧美日韩操逼嗦吊| 国产美脚女优尤物在线观看| 四虎免费在线播放| 91人精品妻入口| 99精品在线观看| 精品999日本| 中文字幕乱亚洲美女精品一区| 五月婷网站| 欧美制服另类丝袜| 老鸭窝在线视频播放| 九九精品99| 啊啊啊操一区| 欧美,日韩,中文,另类| 国产女s强制榨精视频| 九九综合色| 欧美亚州色的图| 精品无码一区二区三区色欲| 国产精品色色| 国偷自 一区| 夜夜操美女| 67914亚洲精品| 亚洲色图综合网| 日本一区二区亚洲综合| AV天天在线观看| 后入人妻无码| 黄色免费网页无码| 亚洲伊人久久精品影院| 国产丝袜欧美在线视频| 色999人与兽| 中文字幕欧美精品亚洲日韩蜜臀| 上海一级黄片| 综合天天网| 2018天天日天天日| 天天综合香 ld视频| 中文字幕精品码亚洲| 欧美极度丰满熟妇hd| 日韩午夜国产| A片A5445444| a久久| 熟妇无码视频三区| aaa一级黄片| 欧美高潮| 色综合av男人天堂| 熟女精品一区二区在线观看| 为用户提供免费看黄网址在线观看| 丰满少妇人妻久久久久久| 黄页| 97视频在线免费观看| 鸡巴插逼视频| 亚洲日韩久久精品一区| 日本操大逼| 久久中出| 澳门特级毛片免费观看| 懂色av中文字幕一区二区三区天美| 香港澳门日本三级网站| 国产精品久久久777| 中文字幕美女91| 在线天堂999| 中文操逼字幕| 天天天天做夜夜夜夜做| 亚洲自拍天堂| 亚洲美女 晚间男人天堂 | 日韩无码三级影院| 啊啊啊不要嗯嗯在线观看| 国产精品亚洲一级av第二区| 狠狠躁日日躁夜夜躁A| 亚洲欧综合另类无码一区| 久九9精品| 日韩人妻免费精品| 超碰 欧美| 亚洲欧洲日韩国产自在线| 色97欧美| 后X久久| 免费精品无码一级毛片牛牛影视 | 国产原创自拍| 亚洲无线观看久久| 久久偷拍人| 亚洲囯产精品女人久久久| 99色骚| 大色综合网| 热久久九九热| 日本激情免费大片| 啊啊啊水好多| 天天综合~91入口| 97超碰色| 77国产精品| 国产免费永久精品无码| 天天澡天天爽日日AV| 少妇69中文| 八人操人人摸人人看| 操老熟女AV| 亚洲中文字幕97久久精品少妇| 国产一国产一级毛片古装| 69精品人人人人| 日本操嫩b网| 91高清欧美| 美女露胸露屁股| 国产最新小视频在线播放下载 | 欧美情色亚洲| 亚洲国产综合久久久性感熟妇| 在线无码视频| 97久久久久| 操我啊啊啊啊啊| 欧美人与动性人交a| 97免费在线观看| 久久久久9久久久久| 久久性爱精品一区| 91性网| 中文字幕55555| 久久久久久精品免费看A级| 日日爱99| 国产九九九九九九| 91超级碰| 中文字幕一区电影在线观看| 久久久96| 哑洲在线| 大香网伊人久久综合网eew| 岛国成人av在线播放网址| 中文字幕在线观看网址| av网页一区二区三区| 日本在线不卡v二区| 色噜噜国产精品视频一区二区| 黑人中出21连凳花野真衣| 国产色呦呦| 超碰在线人人射| 欧美精品激情| 亚洲天堂一二| 久久中文色图| 日本 欧美 亚中文字幕| 色色色欧美| 91熟女视频| 中文字幕免费看| 欧美成人亚洲精品| 99热66| 国产性久久久| 精品国产一区探花在线观看| 欧美色图小说综合| 无码视频一区二区| 偷窥自拍亚洲色图| 中文字幕性感少妇av| 亚洲av无码成电影在线播放| 欧美激情综合网| 中文字幕午夜精品久久久| 91亚洲不卡一区| 天美麻花大全视频| 国产网站在线播放| 久久69精品久久久久久久| 国产精品久久久 | 久久亚洲色图中文字幕| 久久伊人在线五区| 麻豆国产尤物AV| 97欧美性爱| 午夜亚洲国产理论秋霞| 五月丁香黄色网| 丰满人妻-区二区三区免费看| 欧美激情亚洲情色| 久久久99999久网站| sss视频华人在线| 国产熟女精品一区二区| 在线看污网站| 久久久久久久久久久久欧美日| 91爱综合| 看看小穴| 熟女日韩| www.欧精品| 涩涩五月天| 欧美日韩99| 成人日本视频人妻在线| 日韩女模中文造逼| 国产精品久久久鸭无码的功能| 中文字幕日韩人妻视频一区二区三区| 欧美日韩黄片精品在线| 天天懆天天日| 国产日韩欧美中文在线播放| 搞中出久久| 国产多人在线观看视频| 一区不卡在线观看av| 影音先锋日本乱伦| 国产一级特黄大片处女| 久操com| 韩国一级婬片A片无码天美 | 99久久com免费视频′| 精品丰满人妻一区二区三区免费观| 亚洲综合激情五月久久| 国产精品一二三区福利| 草b在线| 亚洲欧美综合色| 成人电影一区| 欧美黄页在线| 97内射偷拍| 久久熟妇五十路一区| 丝袜综合| 久久精品视频一区三区小泽玛利亚| 一区二区视频你懂的| 亚洲综合伊人| 精品国产乱码久久久久久久久久毛片| 麻豆成人AV| 亚洲人妻在线精品| 国内偷自视频区视频综合 | 91精品啪在线观看国产城中村| 欧美性巨大╳╳╳╳╳高跟鞋| 天天干夜夜一操| 婷婷探花久久精品一区| 一级特级aaaa毛片免费观看| 国产树林里野战在线看| 丝袜美腿制服人妻二区中文字幕| 国模少妇一区二区三区| 久久精彩免费视频| 亚洲精品丝袜| 久啪| 人妻激情视频| 秋霞怕怕片| 久久人人爽爽人人爽人人片αV| 黑丝自慰喷水网站| 91蜜桃婷婷狠狠久久综合9色| 91欧美高清| 午夜精品久久久久久久99热影院| 国产精品婬乱一级毛片彝族| 亚洲97久久精品亚洲| 思思热在线观看| 色眯眯射| 91日韩网站| 91中出| 日韩人妻一二三区视频| 婷婷导航| 久久久18禁| 欧美草草高清日韩视频| 亚洲av无码成电影在线播放| 国产一区二区欧美日本| 美女超碰978| 99蜜桃臀久久久欧美精品网站| 亚洲在线观看| 日韩啊V| 又大又长又粗又爽又黄| 69精品久久久久中文字幕| 超碰av人人人| 男人的天堂va在线| {男男暴菊gay无套网站| 亚洲乱码尤物193YW| 久久久精品国产亚洲伊人| 青青国产在线拍揄自揄拍| 成人AV在线网站| 国产一区二区免费福利片| 日本亚洲熟女视频| 午夜精品久久久99| 久久精品电影在线| 亚洲三区视频| 67194无码不卡| 日韩人妻丝袜美腿中文| 国产精品点击进入在线影院高清 | 国产91专区| 青青草一区二区高清无码视频| 肏逼福利网站| 色欲久久综合| 美女黄码视频午夜| 91综合网| 九九热超碰| 亚洲自拍欧美色综合| 91处女在线观看| 欧美成人性爱视频大全| 天美传媒在线一区| 国产女人视频三四五区| 久久美女福利是上海美女| 亚洲欧美天堂| 在线观看黄色电话| 性色国产东北露脸精品视频| 色香天天| 伊人色综合网电影| 日本精品人妻少妇一区二区| 天堂性色| 四虎影院成年人片| 日韩中文9| 亚洲无码国产探花在线观看| 超碰三级秋霞| 九九九九亚洲| 欧美一区二区三区日韩| 成人精品一区二区三区| 中国农村熟妇毛片视频| 91人人看| 国产白丝av| 综合色播| 青青草一本道福利视频| 亚洲 国产 精品一区| 女人天堂AV五区在线| 日韩中文字幕宗合在线| 日韩精品中文字幕一| 在线视频一区二区传媒| 91性色| 亚洲精品乱码久久久久久蜜桃麻豆| 九九成人精品| 一起草精品人妻| 国产视频第2页| 麻豆视频国产一区二区| 久久色一区| 男人在线天堂| 亚洲情色第一页| 久操免费观看| 青娱乐二区免费| 91丨国产丨白浆| 亚洲图片欧美色| 中文字幕高清20页视频| 91美女小视频| 乱精品一区字幕二区| 嗯嗯啊啊啊好爽| 97色婷婷| 欧美AB在线| 蜜臀久久久久久999| 熟女人妻一区二区三区| www四虎| 日本一级特级毛片视频| 人人摸人人干| 久久香蕉国产线看观看亚洲女人 | 五月开心久久AV官网| 人人 操人人 操人人| 91日产欧美| 国产亲戚伦亲在线| 亚州精品人妻一二三区| av婷婷色婷婷色六月| 偷拍亚洲视频一区二区三区四区| 成人片在线播放| 好爽视频在线观看| 久久久9视频| 自拍偷拍 日韩欧美| 75大香蕉| 操逼逼中文字幕| 激情欧美日韩女同久久| 日韩一级片在线看| 天天色欧美| 日韩精品在线观看观看| 亚洲丰满很很操| 色色五月丁香| 午夜小电影在线插入淫高潮 | 青娱乐黄色录像| 欧美性天天影视| 大二网站亚洲| 日韩淫色网| 操逼网免费无码视频| 91麻豆天美传媒在线| 麻豆国产av网| 日韩在线观看字幕精品| 72av视频| 麻豆国产原创AV色哟哟| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 欧美精品1区2区3区| 精品欧美乱码久| 欧美一区二区日韩传媒搭讪精品| 国内毛片婷婷六月色| 综合五月天| 用力操死我| 女人喷水视频在线观看| 欧美天堂在线| 97超级欧美| 2024人人操人人摸| 无码137片内射在线影院| 精品中文一区二区| 草草影院在线视频| 人人做天天爱| 亚洲诱惑天堂| 亚洲……91| 久久久久国产精品喷潮免费观看臀 | 亚洲性网| 色天堂在线观看| 六月婷婷五月丁香| 日韩在线性爱免费视频| 欧色网址| 大香蕉综合在线| 伊人色综合网| 无码丰满熟妇一区二区浪潮AV| 日韩大香蕉AV影片| 97天天弄| 女色视频社区| 97在线免费看视频| 国产精品久久久九九九| 亚洲欧洲偷拍一区| 黄色大香焦1级‘′‘| 日韩无码一区二区三区| 亚州国产成人精品女人久久 | av日韩中文字幕| 日本999精品视频| 激情九月婷婷| 日韩亚洲中文字幕在线| 在线午夜成人无码视频| 日日摸日日弄日日拍| 1区2区3区中文字幕日韩| 伊人色综合网| 围产精品一区二区三区视频播放| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲人妻中文在线视频| 香蕉精品二区二区| 亚洲综合夜色| 爱欲AV| 精品视频久久久久九九九九9999| 丝袜美腿制服人妻二区中文字幕 | yiqicaoav| 极品人妻少妇综合| 97超碰精品成| 神马久久久久久久久久久久| 男人亚洲91首页在线| 无码日韩网站| 丰满人妻被猛烈进入中| 天天影视综合色| 亚洲91大片| 熟妇艹鸡八| 午夜久久一区二区无码中出| 成人看片网站| 亚洲色诱惑| 欧美成人性爱视频免费观看| 亚洲国产一区二区入口| 欧美gv在线观看| 三上悠亚在线毛片91| 伊人九九九| 夜夜国自区| 黄色片G G G| 人妻少妇色综合| 日日夜夜国产综合| 亚洲码和欧洲精品激情系列| 国产黄a三级三级三级av在线看| 凸凹视频在线观看| 黄色大香焦1级‘′‘| 变态乱伦伪娘灌肠一区二区| 内射老妇BBWX0C0CK| 日本一区二区亚洲综合| a'v在线资源| 少妇久久| 午夜舔阴达高潮视频免费看| 久久永久无码人妻视频| 国产精品午夜AV完会免费| 欧美第二页| 蜜臀99久久精品久久久久| 4虎在线观看| 一区二区影视| 日少妇视频| 青青草福利视频| 精品人妻一区二区三区日产乱码| 亚洲AV成人无码一区二区三区在线观看| 亚洲天天天| 亚州色图欧美色图| 亚洲色图日韩丝袜制服一区二区五月在线| 亚洲97网站| 一本大道久| 96超碰网| 亚州男人天堂| 1769成人国产精品视频| 久久乐| 日韩在线观看三级电影| 亚洲欧美人妻| 欧美色www亚洲国产阿娇要播| 国产在线综合网| 日韩簧片免费看| 波多野42部无码喷潮在线观看| 精品九九国产无码| 成人性爱美曰韩| 日韩婷婷| 亚洲超碰在线| 久久香蕉国产传媒一区剧情天美| 欧美老熟另类| 欧美成人综合| 精品人妻伦一区二区三区久久| 激情文学小说一区二区| 天天天肏屄肏屄肏屄欧美欧美| 蜜臀久久99精品久久久久久-DVD| 欧美不卡五十路| 51久久夜色精品国产麻豆| 日韩无码a片| 欧美做爰无码A片视频| 亚洲天堂区| 亚洲综合113页| 伦理弟一页| 亚洲影视第一页| 人人澡人人干| 日欧操屄| 久精品无码av一区二免费国产在线观看 | 啊啊啊97视频| 加勒比综合a∨| 欧美中日韩XXXX| 国产精品点击进入在线影院高清| 国产日韩欧美中文在线播放| 乱伦系列一区二区| 欧美乱色| 日韩欧美水蜜桃人妻| 丝袜视频网国产90| 天堂成人网| 日韩精品在线放| 东亚亚洲无码高清| 素人播放一区| 欧美成人一区二区| 国产97色在线| 久久久久久人妻一区精品色欧美| 国模少妇一区二区三区| 小草三级久久观看| 欧美在线视频观看一二三四区高清| 欧美日本不卡在线| 岛国免费视频在线| 精品久久人妻成人网| 欧美国产精品| 人人妻人人狠人人| 欧美黄色大香蕉一区二区| 色97| 欧美色图 人妻| 嫩草伊人久久精品| 久久久一区二区三区麻豆| 人人操人人爽人人操人人| 在线观看日韩av不卡| 日韩欧美麻豆大片| 福利五区| 国产无码久久高清| 在线只有精品| 久热久操| 国产偷拍网站| 亚洲国产一区二区三区四区国产| 国产超碰在线一区| 老熟乱一区二区三区四区| 国产精品毛片?v一区二区三区| 色色激情五月天| 宅男91视频在线播放| 日韩专区久久久| 激情五月综合开心五月| 五月婷婷激情综合| 日本欧美m v精品网站加| 超碰97人妻免费在线| 亚洲一区日韩| 天天综合网~91综合网| 亚洲国产另类在线中文| 五月丁香| 久久久久久久久国产| 国产精品网址| 亚洲欧美一区二区三区在钱蜜桃| 色欲久久99精品久久| 欧美大香蕉久| 久操99| 人妻熟妇一区二区三区| 五月天婷精品激情| 久久久久久九九九九-美女久久久久久久-成人AV | 综合网91| 国产激情av女片自拍| 黄色十八禁网站| 易易A毛视频| 999岛国大片| 偷拍色图| 国模不卡| 九九九影院| 不卡av在线中文字幕| 久操高青| 97欧美视频| 婷婷五月天社区| 偷拍导航视频网站| 国产剧情AV不卡在线观看| 操淫穴亚洲五月丁香 | 国产精品成久久久久午夜午夜| 91丨九色丨东北熟女| 青青草AV色| 欧美视频一区二区在线| 风月影院男女十八禁| 国产一级内射无挡观看| 久久99999| 日本熟女不卡视频| 久久少妇视频| 超清福利精品视频在线| 91久久18禁| 啪啪啪精品| 啊啊啊快操我视频| 精品日韩人妻精品一二三区| 一区麻豆 高清中文字幕| 免费操逼91| 黑丝少妇麻豆| 日本一级特级毛片视频| 人妻精品4K4K4K4K4| 3PAV乱伦视频| 中文字幕加勒比海高清无码免费视频 | 亚洲综合性感在线| 91综合色噜噜| 亚州色图狠狠干| 日本精品网站在线中文| 岛国999| 久久国产热视频97电影| 人人九九精| 人人天天干干| 中文字幕一区二区三区人妻不卡 | 91精品黄在线观看| 偷拍亚洲视频一区二区三区四区| 五月丁香婷婷综合网| 风间由美日韩欧美久久| 鲁鲁色综合网| 欧美激情激情xxxx欧美专区| 吉川爱美98堂在线| 中文字幕一区二区日韩网| 60秒免费视频| 强奸a片网| 91人人操| 少妇同性| 亚洲成人性爱在线观看| 久久久久久中文| 欧美日韩丝袜| 欧差乱伦二三| 国产精品不卡一区二区三区| caoni国产亚洲av| 精品一区二区三区18| 青青草视频久久| 日韩中文字幕视频| 婷婷九月国产| 少妇二级| 亚洲国产精品无码AV在线| 国产精品第二页| 亚欧成人中文字幕一区| 一区二区影视| 国产婷婷一区| 国产色呦呦| 美女9118禁| 热久久九九热| 国产精品自拍欧美在线| 91爱| 91综合国产精品| 五月天婷婷久久| 亚洲无码 国产无码| 亚州九九九精品视频| 九九色色| 高潮毛片无遮挡高清免费| 伊人四虎综合| 澳门人妻久久| 无码操逼网| 久草午夜| 欧美老妇综合网| 色婷亚洲五月在线观看| 天天看精品动漫视频一区| 亚洲日本天堂| 殴美牲| 亚洲无吗在线视频| 久久区| 欧美影音在线| 欧美 亚洲 综合 制服| 日韩在线一区高清在线| 春色综合网| 人人插人人摸人人| 夜夜欢天天干| 国产小炒后入式| 熟女性视频| 日韩中文字幕人妻视频| 97亚洲在线| 精品九九九九九九九九九| 综合色图,成人综合网| 特级特黄一级毛片免费| 久久久不卡| 亚洲吊色| 亚洲丝袜二区| 五月综合婷婷久久网站| 日韩啊V| 偷拍视频青青草在线视频| 欧美亚洲日韩16色| 夜夜操二区| 97国产高清视频在线观看| 搡老女人老91二区| 性生活无遮挡纯毛片在线看| 丁香六月婷婷| 国产女人和拘做爰视频 | 国产精品久久久久久夜夜夜| h4610国产人妻| 欧美91精品国产自产| 加勒比av网| 中文一区二区婷婷视频| 另类专区在线观看| av在线免费一区二区| 色吧 综合| 伊香蕉综合久久久久久久噜噜噜| 久草精品视频| 白丝jkav| 全球成人中文在线| 亚洲 自拍偷拍 欧美| 无码不卡亚洲成?人片| 99超碰网| 插入粉嫩少妇视频| 四虎AV影视国产精品亚洲精品| 国产少妇与亚洲av| 久操不卡视频| 国产精品无码av| 久久精品久| 美女91AV| 天堂性色| 97ai亚洲| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 3级毛片一二| www.acm成人黄色毛片| 动漫区日韩区欧美区| 亚洲综合小视频小说在线观看 | 欧美日韩狠狠爱| 欧美日本视频一区| 色哟哟av网址| 色情亚洲日本成人| 国产日韩精品一区二区三区| 成人在线视频二区| 澳门黄片一香蕉视频| 在线亚洲欧美| 久久一区二区蜜桃| 亚洲人妻爽爽爽| 日韩综合97p| 97鸡把在线视频| 理论久久婷婷网8| 亚洲精品乱码久久久久久蜜桃麻豆 | 久jiu久神马影院| 国产av高清版| 色老汉玖玖爱| 青青草九九九九九| 人人喜人人妻| 日本不卡码黄色| 嗯嗯嗯不要不要免费视频| 婷婷色香| 色欧美天天| 蜜色网色哟哟| 欧美 综合| 少妇500双飞99| A男人的天堂| 天堂综合| 少妇贴图| 熟妇色99| 人人操,人人液| 偷拍综合网| 天天射夜夜操| 日本高清视频xxxx| 在线观看无码三级少妇| 国产精品成人福利在线| 强奸乱伦麻豆| 伊人久久婷婷| 狼天天狼天天大香蕉| 久久一区无码| 啊啊啊不要好爽日韩无码一区| 久草毛片电影怡| 久久人体一区二区| 日韩不卡码| 国产精品69久久久久孕妇欧美| 久久久久久91香蕉国产| 综合天天网| 综合情欲网| 清纯唯美第一页| 人人摸人人入| 国产午夜福利专区综合| 久久riav中文精品| 欧美日韩中文亚洲v在线综合| 探花精品视频| 中文字幕一二三区| m欧洲一级午老| 四虎影视国产精品| 色99999| 亚瑟国产精品久久无码| 日本高清有码网址视频| 亚洲天堂热| 熟女在线视频| 自拍丝袜美腿人妻| 一二三四视频在线社区中文字幕| 中文字幕一二三av| 色欧美亚洲| 亚洲欧美日韩免费电影| 欧美极品性爱天天射| 色噜噜人妻丝袜a∨先锋影| 欧美淫穴| 麻豆激情综合| 啊啊啊啊免费视频| 欧美日韩在线小说 | ′ !γ}丶。。久久精品欧美一区二区三区| 国产丝袜美女诱惑| 秋霞男人网| 亚洲人综合| 成人草草视频| 国产精品一区二区a| 麻豆国产视频精品观看| 美女黄频a美女大全免费皮| 看日韩美女二区三区免费操逼视频| 亚洲青青青视频在线| 爱爱久久| 丝袜AV一区二区三区| 操婢日韩| 99天堂网| 亚洲淫乱骚妇AV| 玖玖综合视频| aV中文麻| 香蕉国产精品麻豆亚洲欧美日韩| 国产精品网址| 亚洲操操操| 嗯嗯嗯好爽| 曰韩香蕉97| 亚洲情色综合| 无码WWW免费视频网站| 综合色图区| 九九av| 精品人妻一区二区三区四区不卡在| 视频国产成人精品日本亚洲18| 国产乱码精品一区二区三区四川| 一区二区偷拍拍视频| 农村妇女精品一区二区| 懂色综合久久久| 久久9亚洲| 超碰午夜| 2024年最新色情网站在线观看| www.色操逼| 国产偷人妻精品一区二区在线| 青青草好吊色| 欧美性爱一级操| 国产丰满熟夫69mpp| 熟女91网站| 91操人| 久久欧美按摩999| 2019男人的天堂| 久久久久亚洲AV无码专区少妇| 日本三级中国三级99人妇网站| 久久偷偷色综合蜜桃| 久久啊啊啊| 日本在线不卡一二区| 青娱乐手机日韩在线视频| 亚洲一区二区在线观看91| 五月天社区| 屌妞视频久久久久久久久久久久| 91国产丝袜白虎| 国产精品人人爽人人做可爱福利| 中文字幕啊啊啊在线观看视频| 超碰色美女| 黄片aaaaa一区| 国产二区三区免费视频| 粉嫩av一区二区三区四季| 深夜激情 | 日韩 欧美 视频 在线 一区| 色老汉色| 中文字幕第2页| 国产成人无码久久精品| 99热 按摩 日韩| 超碰97人妻免费在线| 高潮内射在线| 最新AV在线| 国产成人网| 亚洲精品蜜桃久久久久久久| 男女啪啪网站免费视频| 国产欧美日韩女同性恋ww喷水精品| www.成人无码| 亚洲最大AV网| 色五月AV在线| 91人妻精华帖| 欧美中文狠| 淫荡网址| 青青国产精品在线| 女人综合网| 五月综合激情网| 国产一二三福利视频网| 久9热| 99精品无码| 色综合色色| 2017,超碰| 九九aV| 上床啊啊啊| 国产亚洲精品玖玖玖在线观看| 91色伦综合| 国产A v无码专区| 久久久专区| 国产操逼逼网| 久久精品日韩专区免费观看| 插穴性爱视频在线观看| 日日干夜夜欢| 亚洲福利中文字幕在线| 夜夜操夜夜高潮夜夜爽国产精品区| 国产懂色精品国产av| 午夜毛片高清免费不卡| 日本日逼高清| 大香蕉92| 十八禁av无码免费网站APP| s片在线观看| 日韩免费看黄片| 久久人妻一区二区三区高清| 黄色高清无码无码破解免费暗网| 五月天精品| 久久婷婷视频| 中文字幕99999| 久久久av爱| 九九热久久99精品re| 东京热熟女亚洲视频网站| 亚洲AV无码国产精品久久久久 | 美女自卫慰黄网站免费| 欧美97se| 天天影视综合网欧美精品| 精品无码一区二区三区色欲| 欧美老妇综合网| 亚洲导航深夜福利| 香蕉免费一区二区三区不读| 午夜影美女日鸡鸡天天视频国产| 国产黑白丝在线| 欧美一区二区观看在线|