[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] The ScrollableCursor's issues
|
Thanks a lot for your answer, James Sutherland.
It is very useful for me.
Regards
Dmitry
James Sutherland wrote:
>
> 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
>>
>
>
--
View this message in context: http://www.nabble.com/The-ScrollableCursor%27s-issues-tp19392081p19453204.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.