У меня есть лист excel, содержащий около 25 000 строк. Каждая строка в листе excel будет рядом с моей таблицей. Я попытался сделать следующее, и это просто заставляет меня отдавать память из исключения. Я попытался изменить пакетный размер с 25 до 50, 100, 500. Ни один из них не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно? изменение размера кучи JVM для меня не является вариантом.класс java.lang.OutOfMemoryError при сохранении данных в базе данных Oracle
public void saveForecast(List list) throws FinderException{
final Session session = getCurrentSession();
final int batchSize = 25;
Connection con = null;
PreparedStatement pstmt = null;
Iterator iterator = list.iterator();
int rowCount = list.size();
String sqlStatement = "INSERT INTO DMD_VOL_UPLOAD (ORIGIN, DESTINATION, DAY_OF_WEEK, EFFECTIVE_DATE, DISCONTINUE_DATE, VOLUME)";
sqlStatement += " VALUES(?, ?, ?, ?, ?, ?)";
System.out.println(sqlStatement);
System.out.println("Number of rows to be inserted: "+ rowCount);
System.out.println("Starting time: "+new Date().toString());
try{
con = session.connection();
for(int i=0; i<rowCount; i++){
ForecastBatch forecastBatch = (ForecastBatch) iterator.next();
pstmt = con.prepareStatement(sqlStatement);
pstmt.setString(1, forecastBatch.getOrigin());
pstmt.setString(2, forecastBatch.getDestination());
pstmt.setInt(3, forecastBatch.getDayOfWeek());
java.util.Date effJavaDate = forecastBatch.getEffectiveDate();
java.sql.Date effSqlDate = new java.sql.Date(effJavaDate.getTime());
pstmt.setDate(4, effSqlDate);
java.util.Date disJavaDate=forecastBatch.getDiscontinueDate();
java.sql.Date disSqlDate = new java.sql.Date(disJavaDate.getTime());
pstmt.setDate(5, disSqlDate);
pstmt.setInt(6, forecastBatch.getVolumeSum());
pstmt.addBatch();
if(i % batchSize == 0){
pstmt.executeBatch();
session.flush();
session.clear();
}
}
pstmt.executeBatch();
pstmt.close();
System.out.println("Ending Time: "+ new Date().toString());
}catch(SQLException e){
e.printStackTrace();
throw new FinderException(e);
}
finally{
HibernateUtil.closeSession();
}
}
}
Немного вещей, которые я вижу 1) вы используете цикл for и итератор для прохождения вашего списка - вы должны использовать один или другой r (Я проголосовал за итератор). Также что происходит с небольшим файлом excel? В какой момент это задыхается? –
создать кучу дампа и использовать профайлер памяти. то вам не придется догадываться, что вызывает проблемы. – jtahlborn
Каков размер на диске вашей таблицы. Какую программу вы используете? – nsfyn55