我可以使我的数据提取程序(Oracle数据库擅长)更有效吗?

我目前使用apache.poi从数据库中提取数据到excel。 我只是想看看是否有可能加快提取过程。 我在JSP中有一个select值,要求提取3500行数据,这是唯一的情况,极其缓慢的执行。 我从提取中创build两个独立的Excel文件。

第一类是简单的数据提取:

private void createSiteFieldExcel(String workSheetName, List<String> columnHeader, List<MasterDataDto> masterDatatDtoList) { XSSFSheet sheet = masterDataWorkbook.createSheet(workSheetName); int cellNumber = 0; int rowNumber = 0; Row headerRow = sheet.createRow(rowNumber++); sheet.createFreezePane(0, 1); List<MasterDataDto> dataConsistencyList = new ArrayList<MasterDataDto>(); for (Iterator<String> iterator = columnHeader.iterator(); iterator.hasNext();) { Cell cell = headerRow.createCell(cellNumber++); cell.setCellValue(iterator.next()); // sets the header to be bold cell.setCellStyle(masterDataBoldStyle); } for (MasterDataDto masterDatatDto : masterDatatDtoList) { Row dataRow = sheet.createRow(rowNumber++); cellNumber = 0; Cell cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getDivision()); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getProject()); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getSiteName()); if (columnHeader.size() == 4) { cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getField1()); if (masterDatatDto.getField1() == null || masterDatatDto.getField1().trim().equals("")) { dataConsistencyList.add(masterDatatDto); } } else if (columnHeader.size() == 5) { cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getField1()); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getField2()); if (masterDatatDto.getField2() == null || masterDatatDto.getField2().trim().equals("")) { dataConsistencyList.add(masterDatatDto); } } // Auto sizes column width for (int i = 0; i <= 5; i++) sheet.autoSizeColumn(i); } createConsistencyCheckFile(dataConsistencyList, columnHeader); // Auto sizes column width for data consistency excel for (int i = 0; i <= 9 ; i++) dataConsistencyWorksheet.autoSizeColumn(i); dataConsistencyWorksheet.createFreezePane(0, 1); } 

第二类是检查数据的一致性(显示数据库中没有空白数据)

  private void createConsistencyCheckFile(List<MasterDataDto> dataConsistencyList, List<String> columnHeaders) { Cell cell = null; Row dataRow = null; int cellNumber = 0; dataRow = dataConsistencyWorksheet.createRow(dataConsistencyWorksheetRowNumber++); cell = dataRow.createCell(cellNumber++); cell.setCellValue(dataConsistencyWorksheetRowNumber - 1); cell = dataRow.createCell(cellNumber++); cell.setCellValue("SUMMARY"); cell = dataRow.createCell(cellNumber++); cell.setCellValue(columnHeaders.size() - 1); cell = dataRow.createCell(cellNumber++); cell.setCellValue(dataConsistencyList.size()); for (String columnHeader : columnHeaders) { cell = dataRow.createCell(cellNumber++); cell.setCellValue(columnHeader); } for (MasterDataDto masterDatatDto : dataConsistencyList) { cellNumber = 0; dataRow = dataConsistencyWorksheet.createRow(dataConsistencyWorksheetRowNumber++); cell = dataRow.createCell(cellNumber++); cell.setCellValue(dataConsistencyWorksheetRowNumber - 1); cell = dataRow.createCell(cellNumber++); cell.setCellValue("DETAIL"); cell = dataRow.createCell(cellNumber++); cell.setCellValue(columnHeaders.size() - 1); cell = dataRow.createCell(cellNumber++); cell.setCellValue("N/A"); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getDivision()); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getProject()); cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getSiteName()); if (columnHeaders.size() == 4) { cell = dataRow.createCell(cellNumber++); cell.setCellValue("???"); } else if (columnHeaders.size() == 5) { cell = dataRow.createCell(cellNumber++); cell.setCellValue(masterDatatDto.getField1()); cell = dataRow.createCell(cellNumber++); cell.setCellValue("???"); } } } 

本来我只有第一堂课,虽然需要时间来运行它完成。 由于我已经添加了数据一致性类部分,所以在创build第一个表之后超时。

我最初使用Apache POI是因为当我使用JXL时,它不允许我在一张纸上插入超过65,500条logging(行)。 我有很多提取。 请让我知道,如果我需要提供更多的我的程序,以更清楚地了解我的问题。 我真的很感谢你的帮助

我还有一个问题想补充说明。 我正在考虑将数据库数据提取到CSV文件中,然后将CSV文件导入到Excel中。 我有一个问题,因为我原来是提取到工作簿中的多个工作表,有没有办法可以导出到多个CSV文件? 那么从多个CSV文件中,我怎样才能将它们添加到工作簿中的不同工作表中?

再次感谢桑尼

你好道格这是我的查询代码:

  public List<MasterDataDto> getDFMasterData(int siteValueId, int firstColumnId, int secondColumnId, int divisionId) throws IOException, ClassNotFoundException, SQLException { List<MasterDataDto> masterDatatDtoList = new ArrayList<MasterDataDto>(); Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { StringBuilder query = new StringBuilder(); query.append("Select Distinct Dt.Name Division, Pr.Name Project, Addtl_Type.Name Site_Name, Atprt.Name col1, Atchd.Name col2"); query.append(" From Addtl_Type_Rel Attr, Addtl_Type_Rel Attchd, Addtl_Type_Rel Attgrch, Addtl_Type Atprt, Project Pr, Addtl_Type Atchd, Addtl_Type, Division_Type Dt"); query.append(" Where Pr.Id = Attr.Parent_N_Value"); query.append(" And Attr.Id = Attchd.Previous_Rel_Id"); query.append(" And Pr.Division_Type = Dt.Id"); query.append(" And Atchd.Id = Attgrch.Child_N_Value"); query.append(" And Attgrch.Parent_Field_Id = Attchd.Child_Field_Id"); query.append(" And Attchd.Id = Attgrch.Previous_Rel_Id"); query.append(" And Attr.Child_Field_Id = Attchd.Parent_Field_Id"); query.append(" And Atprt.Id = Attchd.Child_N_Value"); query.append(" And Attchd.Parent_N_Value = Addtl_Type.Id"); query.append(" And Attr.Parent_Field_Id = ?"); query.append(" And Attr.Child_Field_Id = ?"); query.append(" And Attchd.Child_Field_Id = ?"); query.append(" And Attgrch.Child_Field_Id = ?"); query.append(" And Dt.Id = ?"); if (siteValueId != 0) { query.append(" And Attr.Child_N_Value = ?"); } query.append(" Order By Project, Site_Name, col1, col2"); con = getConnection(); ps = con.prepareStatement(query.toString()); ps.setInt(1, MasterDataConstants.PROJECT); ps.setInt(2, MasterDataConstants.SITE_NAME_ID); ps.setInt(3, firstColumnId); ps.setInt(4, secondColumnId); ps.setInt(5, divisionId); if (siteValueId != 0) { ps.setInt(6, siteValueId); } rs = ps.executeQuery(); while (rs.next()) { MasterDataDto masterDataDto = new MasterDataDto(); masterDataDto.setDivision(rs.getString("Division")); masterDataDto.setProject(rs.getString("Project")); masterDataDto.setSiteName(rs.getString("Site_Name")); masterDataDto.setField1(rs.getString("col1")); masterDataDto.setField2(rs.getString("col2")); System.out.println(masterDataDto.getDivision() + "\t" + masterDataDto.getProject() + "\t" + masterDataDto.getSiteName() + "\t" + masterDataDto.getField1() + "\t" + masterDataDto.getField2()); masterDatatDtoList.add(masterDataDto); } } finally { cleanUp(con, ps, rs); } return masterDatatDtoList; 

我怎么能使这个更有效率? 谢谢桑尼

你好,我所有的这个程序有一个新的问题。 我已经删除了autoSizeColumn,它到达了将要写入Excel工作簿的地方。 我现在正在得到一个java.lang.OutOfMemoryError。 以下是错误的完整堆栈跟踪:exception

javax.servlet.ServletException:Servlet执行引发exception

根本原因

 java.lang.OutOfMemoryError: GC overhead limit exceeded org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1592) org.apache.xmlbeans.impl.store.Saver$TextSaver.preEmit(Saver.java:1223) org.apache.xmlbeans.impl.store.Saver$TextSaver.emit(Saver.java:1144) org.apache.xmlbeans.impl.store.Saver$TextSaver.emitElement(Saver.java:926) org.apache.xmlbeans.impl.store.Saver.processElement(Saver.java:456) org.apache.xmlbeans.impl.store.Saver.process(Saver.java:307) org.apache.xmlbeans.impl.store.Saver$TextSaver.saveToString(Saver.java:1727) org.apache.xmlbeans.impl.store.Cursor._xmlText(Cursor.java:546) org.apache.xmlbeans.impl.store.Cursor.xmlText(Cursor.java:2436) org.apache.xmlbeans.impl.values.XmlObjectBase.xmlText(XmlObjectBase.java:1455) org.apache.poi.xssf.model.SharedStringsTable.getKey(SharedStringsTable.java:130) org.apache.poi.xssf.model.SharedStringsTable.addEntry(SharedStringsTable.java:176) org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:350) org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:320) master.service.MasterDataService.createSiteFieldExcel(MasterDataService.java:1102) master.service.MasterDataService.createMasterDataFile(MasterDataService.java:886) master.service.MasterDataServlet.doGet(MasterDataServlet.java:22) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

我在哪里必须增加eclipse中的JVM大小。 如果这有帮助,我正在运行Tomcat。 谢谢桑尼

您可能会使用JDBC驱动程序的Excel,也许JDBC ODBC桥,需要一些Windows大惊小怪。 这将是最佳的,因为您需要遍历数据库查询,并可以立即将其写入Excel“数据库”。

http://www.coderanch.com/t/465901/JDBC/databases/insert-data-excel-file-java

否则,不要使用DTO列表,而是立即将每个rs.next / DTO添加到Excel工作表。