Quello che mi interesserebbe sapere se c'è un metodo per far si che funzioni tutto normalente anche su PC con poca memoria sia che devo estrarre pochissimi record ma che funzioni in egual modo quando devo estrarre un numero significativo di record.
Posto il codice così magari saprete aiutarmi meglio:
package prova;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Prova{
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String HOST = "localhost";
private static final String PORT = "1521";
private static final String SID = "orcl";
private static final String URL = "jdbc:oracle:thin:@" + HOST + ":" + PORT + ":" + SID;
private static final String USER = "hr";
private static final String PASSWORD = "hr";
private static final String QUERY_ESTRAZIONE = "select * from hr.t_test";
private static List<String> listHeader;
private static List<Map<Integer, String>> listBody;
public static void main(String[] args) {
System.out.println("Start project list: " + LocalDateTime.now());
createXLSXFile("PPM_Project_List.xlsx", "PROVA", QUERY_ESTRAZIONE);
System.out.println("End project list: " + LocalDateTime.now());
}
public static void createXLSXFile(final String excelFileName, final String sheetName, final String query) {
listHeader = new ArrayList<>();
listBody = new ArrayList<>();
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (final Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
final Statement stmt = conn.createStatement();
final ResultSet rset = stmt.executeQuery(query)) {
final ResultSetMetaData rsmd = rset.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
listHeader.add(rsmd.getColumnName(i));
}
while (rset.next()) {
final Map<Integer, String> map = new HashMap<>();
for (int k = 0; k < rsmd.getColumnCount(); k++) {
map.put(k, rset.getString(k + 1));
}
listBody.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
try (Workbook wb = new XSSFWorkbook(); OutputStream fileOut = new FileOutputStream(excelFileName)) {
Sheet sheet = wb.createSheet(sheetName);
addHeader(sheet);
addBody(sheet);
wb.write(fileOut);
fileOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void addHeader(final Sheet sheet) {
Row rowHeader = sheet.createRow(0);
Cell cell = null;
for (int i = 0; i < listHeader.size(); i++) {
cell = rowHeader.createCell(i);
cell.setCellValue(listHeader.get(i));
}
}
private static void addBody(final Sheet sheet) {
Row row = null;
Cell cell = null;
Map<Integer, String> entry = new HashMap<>();
for (int i = 0; i < listBody.size(); i++) {
row = sheet.createRow(i + 1);
entry = listBody.get(i);
for (Integer key : entry.keySet()) {
String value = entry.get(key);
cell = row.createCell(key);
cell.setCellValue(value);
}
}
}
}
Quello che mi chiedo è se ci sarebbe il modo di migliorarlo affinché non mi restituisca più quell'errore.