Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-dev] MemoryLeak by CursoredStream??

Hello,

I use eclipselink and it's very nice. Our backend DB is MSSQL. I have to run pagination to millions of records. It seems eclipselink doesn't support setFirstResult/setMaxRows Pagination about MSSQL.
https://wiki.eclipse.org/EclipseLink/Examples/JPA/Pagination
Using above method, performance wasn't good because MSSQL pagination query(FETCH OFFSET) isn't used.

So, I tried to use CursoredStream as below. 
https://wiki.eclipse.org/Using_Advanced_Query_API_(ELUG)#Handling_Cursor_and_Stream_Query_Results
The problem is even if cursor.clear() is called, all record objects remain in UnitOfWork object as DescriptorEvent. I have to update records so "READ_ONLY" query hint can't be used.
===============================================
int max = 1000;
query.setHint(QueryHints.CURSOR, HintValues.TRUE)
		.setHint(QueryHints.JDBC_FETCH_SIZE, max);
CursoredStream cursor = (CursoredStream)query.getSingleResult();
while (cursor.hasNext()) {
	list = cursor.next(max);
	for (Object recordObj : list) {
		RecordEntity record = (RecordEntity)recordObj;
		doSomething(record)
		record.setSomeValue(someValue); // the record has to be updated
		entityManager.merge(record);
	}
	cursor.clear(); //cursor.releasePrevious() doesn't work as well
}
cursor.close();
===============================================
Is it possible paging records by CursoredStream without getting all records in memory? If anyone could tell me, it's really helpful.

Thank you,
Atsuo


Back to the top