Могу ли я сделать свою программу извлечения данных (базу данных Oracle для более эффективной) более эффективной?

1

В настоящее время я извлекаю данные из базы данных в excel с помощью apache.poi. Я просто хотел узнать, удалось ли ускорить процесс извлечения. У меня есть значение выбора в моем JSP, которое вызывает 3500 строк данных, которые нужно извлечь, и это единственный случай, который чрезвычайно замедляет выполнение. Я извлекаю два отдельных файла 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("???");
        }

    }

}

Первоначально у меня только что был первый класс, и хотя это займет время, чтобы запустить его, он закончил. Поскольку я добавил часть класса согласованности данных, он истекает после создания первого листа.

Я изначально использовал Apache POI, потому что, когда я использовал JXL, он не позволял мне вставлять более 65 500 записей (строк) на один лист. Мне нужно много извлечь. Пожалуйста, дайте мне знать, если мне нужно предоставить больше моей программы, чтобы дать более четкое представление о моей проблеме. Я искренне ценю вашу помощь заранее

У меня есть еще один вопрос, который я хотел бы добавить к этому. Я собираюсь извлечь данные базы данных в CSV файл, а затем взять файл CSV и импортировать его в Excel. Один вопрос у меня есть, так как я изначально извлекал на несколько листов в рабочей книге, есть ли способ экспортировать в несколько файлов CSV? Затем из нескольких файлов CSV, как я могу добавить их в разные листы в рабочей книге?

Еще раз спасибо Sonny

Здравствуйте, Doug Вот мой код запроса:

    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. Вот полная трассировка стека ошибки: исключение

javax.servlet.ServletException: выполнение сервлета вызвало исключение

основная причина

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)

Где мне нужно увеличить размер JVM в eclipse. Я запускаю Tomcat, если это тоже помогает. Спасибо, Сонни

  • 2
    Я не эксперт, но пробовали ли вы какие-либо инструменты профилирования, чтобы определить, где большую часть времени выполнения тратится в вашей программе? Просто идея, которая может оказаться полезной для вас в будущем.
  • 0
    Я ценю ваш комментарий. Да, я добавил «println» в свою программу. У него нет проблем с извлечением данных в консоль eclipse, но требуется больше времени, принимая значения консоли и помещая их в Excel. Сынок
Показать ещё 7 комментариев
Теги:
excel
jsp
servlets

1 ответ

0

Вы можете использовать JDBC-драйвер для Excel, возможно, мост ODBC JDBC, требующий некоторого шума в Windows. Это было бы оптимально, так как вам нужно было бы выполнить запрос БД и сразу же записать его в базу данных Excel.

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

В противном случае не используйте список DTO, но сразу же добавьте каждый rs.next/DTO в лист Excel.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню