EclipseLink - wyciek pamięci

EclipseLink - wyciek pamięci
JA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:178
0

Witam
mam taki problem z uciekajaca pamięcia przy eksporcie z bazy danych:

Kopiuj
Query query = getRecordsSelectQuery(ctx, recordDef);
ScrollableCursor scrollableCursor = null;
query.setHint("eclipselink.cursor.scrollable", true);
scrollableCursor = (ScrollableCursor) query.getSingleResult();

while (scrollableCursor.hasNext()) {
                 processExportRecord(ctx, recordDef, scrollableCursor.nextElement());
                 SystemMonitor.logSystemStatistics();
}

W statystykach SystemMonitora z kazdym obiegiem petli wolna przestrzen maleje i po jakimś czasie pamięć się kończy i wyskakuje wyjatek.
Sprawdzałem, blokowałem i czyscilem Cache query róznymi hintami i nic to nie dało.
Wydaje mi sie że to coś ze scrollableCursorem bo gdy inaczej przechodze petle to tego problemu nie ma, ale ScrollableCursor jest najszybszy i dlatego musze go użyć, mógłby ktos coś doradzić ?

SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0
  1. Pokaż zapytanie
  2. Rozumiem, że wszysti idzie na jednej transakcji?
JA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:178
0
Kopiuj
queryText = "SELECT data FROM " + entityName + " data";
			if (!StringUtil.isEmpty(auditCD)) {
				queryText += " WHERE (data." + auditCD + " BETWEEN :rangeStartDate AND :rangeEndDate " + auditMDIsNull
						+ auditRDIsNull + ")";
				if (!StringUtil.isEmpty(auditMD)) {
					queryText += " OR (data." + auditMD + " BETWEEN :rangeStartDate AND :rangeEndDate" + auditRDIsNull
							+ ")";
				}
				if (!StringUtil.isEmpty(auditRD)) {
					queryText += " OR (data." + auditRD + " BETWEEN :rangeStartDate AND :rangeEndDate)";
				}
			}
		} else {
			if (recordDef.getSelectAttribute() != null) {
				queryText = "SELECT data FROM " + entityName + " data WHERE data." + recordDef.getSelectAttribute()
						+ "=" + exportConfig.getExportObjectId();
			} else if (recordDef.isUnlimited()) {
				try {
					Class<?> recordClass = Class.forName(recordDef.getClassName());
					if (AbstractItemData.class.isAssignableFrom(recordClass)) {
						queryText = "SELECT data FROM " + entityName + " data WHERE data.auditRD IS NULL";
					} else {
						queryText = "SELECT data FROM " + entityName + " data";
					}
				} catch (ClassNotFoundException e) {
					throw new FileParserException(FileParserError.FILE_INVALID_CLASS, recordDef.getClassName());
				}
			} else {
				queryText = "SELECT data FROM " + entityName + " data WHERE data.id="
						+ exportConfig.getExportObjectId();
			}
		}
  1. Tak
SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0

A więc jeśli wszystko masz w jednej transakcji to automatycznie do sesji trafiają wszystkie obiekty encji (dodatkowe co każdy przebieg pętli).
Im jest ich więcej tym dłużej to trwają mechanizmy EclipseLink np dirtyChecking. Więc albo podzielisz to na transakcje albo co iteracje pętli zrob cleara
czyli

Kopiuj
exportPosition();
session.clear()//context.clear() co tam masz
 
JA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:178
0

próbowałem clear i nic to nie daje

SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0

No to dziwne. To propnuje w transakcji x pobirać idiki elementów które chcesz wyeksportować. A pozniej w petli

Kopiuj
ids = getIdsToExport()
for (id in ids){
exportPos(id)
}
@Transaction(Required_NEW)
public void exportPos(id){

}
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.