[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] The ScrollableCursor's issues

You are executing the query in the UnitOfWork so all of the returned objects
will be managed (and not allowed to garbage collect).  If you execute it in
the Session (uow.getParent()), then the objects will not be managed and free
to gc, (but must be used as read-only).  You could also call clear() in
between each page, or set the query to be read-only (setIsReadOnly(true)
same as exec in session).

The rollback seems like it is cause because you have a transaction timeout
set somewhere in WAS or your DB.  You will need to find and increase this
timeout.

You could also potentially use JPA firstResult/maxResult to page the
results.


dmitryerkin wrote:
> 
> Hi
> I am trying to use the ScrollableCursor for retrieving about 10.000
> records.
> I have to get them divided into small portions which include 100 records
> each.
> All works well except two issues.
> 
> Firstly I see that the size of memory which is used by JVM is being
> increased while the sequence of invocations of the cursor's next(100)
> method is happening although I want memory which was allocated for
> previous portions to be released.
> The total amount of used memory is about 1Gb for 10.000 records.
> 
> Secondly the transaction which is started to scroll through the cursor
> switches to rollback state after 5 minutes although a lot of invocations
> of the cursor's next(100) method are happening.
> 
> My questions are:
> 1. How can I decrease the size of memory which is used by Eclipselink to
> walk through the cursor?
> 2. Can I set the period of transaction's timeout?
> 
> 
> Here is my code:
> 
> 
> 
> The servlet:
> 
> @EJB ejb3.OebsInterface oebs;
> 
> ...
> 
> oebs.findOebsByTime(time);
> 
> int from = 10000;
> int quantity = 100;
> Vector<RootType> rootList = null;
> while((rootList = oebs.getOebsByTime(from, quantity)) != null){
> 	
> 	int i = 0;
> 	HeaderBaseType header;
> 	
> 	while(i < rootList.size()){
> 		header = rootList.elementAt(i).getHeader();
>                       ...
> 		i++;
> 	}
> 		
> 	from = from - quantity;
> }
> 			
> oebs.releaseOebsByTime();
> 
> 
> 
> The session bean:
> 
> @Stateful
> @TransactionManagement(TransactionManagementType.BEAN)
> public class OebsInterfaceImpl implements OebsInterface {
> 	
> 	@PersistenceContext(name="oebsEJB")
> 	EntityManager em;
> 
> 	@Resource javax.transaction.UserTransaction ut;
> ...
> 
> 	protected JpaEntityManager jpaEM = null;
> 	protected UnitOfWork uow = null;
> 	protected ScrollableCursor cursorByTime = null;
> 	
> 
> 	public void findOebsByTime(XMLGregorianCalendar time) throws
> NotSupportedException, SystemException{
> 		
> 		ExpressionBuilder oebs = new ExpressionBuilder();
> 	           Vector arguments = new Vector();
> 	           arguments.addElement("/o:root/o:header[o:timeOfCreation=\"" +
> time.toString() + "000+00:00\"]");
> 	          
> arguments.addElement("xmlns:o=\"http://www.rosbank.ru/oebs\"";);
> 		Expression where =
> oebs.getField("OBJECT_VALUE").getFunction(Oracle10Platform_Customizer.ExistsNodeWithNamespaces,
> arguments).greaterThan(0);
> 		
> 		ReadAllQuery queryByTime = new ReadAllQuery(OebsView.class, where);
> 		queryByTime.useScrollableCursor();
> 		
> 		ut.begin();
> 		
> 		jpaEM = org.eclipse.persistence.jpa.JpaHelper.getEntityManager(em);
> 		uow = jpaEM.getActiveSession().getActiveUnitOfWork();
> 		if(uow == null){
>     		       uow = jpaEM.getActiveSession().acquireUnitOfWork();
> 		}
> 		cursorByTime = (ScrollableCursor) uow.executeQuery(queryByTime);		
> 	}
> 
> 
> 	public Vector<RootType> getOebsByTime(int from, int quantity) throws
> JAXBException{
> 		
> 		Vector<RootType> rootList = null;
> 
> 		if(from <= cursorByTime.size()){
> 
> 			rootList = new Vector<RootType>();
> 
> 			cursorByTime.absolute(from);
> 			
> 			int q;
> 			if((cursorByTime.size() - from) + 1 >= quantity){
> 				q = quantity;
> 			}
> 			else{
> 				q = cursorByTime.size() - from + 1;
> 			}
> 			
> 			Vector<ejb3.OebsView> oebsList = new Vector<ejb3.OebsView>();
> 			oebsList = cursorByTime.next(q);
> 			System.out.println("oebsList.size is " + oebsList.size());    		
> 			
> 			JAXBContext jaxbContext =
> JAXBContext.newInstance("ru.rosbank.oebs:ru.rosbank.oebs.header:ru.rosbank.oebs.content.assignment:ru.rosbank.oebs.content.organization:ru.rosbank.oebs.content.qualifications:com.ibm.xmlns.prod.websphere.j2ca.jdbc.appsxx_assignment_v:com.ibm.xmlns.prod.websphere.j2ca.jdbc.appsxx_organization_v:com.ibm.xmlns.prod.websphere.j2ca.jdbc.appsxx_qualifications_v");
> 			Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
> 			JAXBElement<RootType> jaxbElement;
> 			RootType root;
> 	    	
> 			int i = 0;
> 			while(i < oebsList.size()){
> 				jaxbElement = (JAXBElement<RootType>) unmarshaller.unmarshal(new
> InputSource(new StringReader(oebsList.elementAt(i).getObjectValue())));
> 				root = (RootType) jaxbElement.getValue();
> 				rootList.add(root);
> 				i++;
> 			}
> 		}
> 		
> 		return rootList;
> 	}
> 
> 	public void releaseOebsByTime() throws SecurityException,
> IllegalStateException, RollbackException, HeuristicMixedException,
> HeuristicRollbackException, SystemException{
> 		uow.release();
> 		
> 		ut.commit();
> 	} 
> 
> This code workes in the Websphere container.
> 
> Regards
> Dmitry
> 


-----
---
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://www.nabble.com/The-ScrollableCursor%27s-issues-tp19392081p19414600.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.