EclipseLink - wyciek pamięci

0

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

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ć ?

0
  1. Pokaż zapytanie
  2. Rozumiem, że wszysti idzie na jednej transakcji?
0
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
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

exportPosition();
session.clear()//context.clear() co tam masz
 
0

próbowałem clear i nic to nie daje

0

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

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

}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1