0 Replies Latest reply: May 5, 2011 3:44 AM by 839484 RSS

    JPA / Eclipselink CursoredStream Error

    839484
      Hi there!
      I have to do a database request on an Oracle XE database which returns about 1 million entities. As it does not make sense to load all of them to memory, I chose a Cursored Stream to do the work.
      My code:
                      /* count nbo entities */
                      ReadAllQuery query = new ReadAllQuery(Entity.class);
                      query.useCursoredStream(5, NBO_ENTITIES_TO_BE_READ_PER_CHUNK);
                      /* disable caching */
                      query.doNotCacheQueryResults();
      
                      CursoredStream stream =
                              (CursoredStream) ((EntityManagerImpl) _entityManager).getSession()
                                      .executeQuery(query);
      
                      /*
                       * run through cursor
                       */
                      while (!stream.atEnd()) {
                          
                          List<Entity> entities = null;
                          try{
                          entities = stream.read(NBO_ENTITIES_TO_BE_READ_PER_CHUNK);
                          }catch(Exception e ){
                              e.printStackTrace();
                          }
                          doSomeWork( entities);
                          stream.releasePrevious();
                          
                      }
                      stream.close();
      The statement does fine with the first loads of data. However, while reading the last chunk of data, the following error happens:
      xception Description: An attempt to read beyond the end of stream occurred.
      Query: ReadAllQuery(referenceClass=Entity)
           at org.eclipse.persistence.exceptions.QueryException.readBeyondStream(QueryException.java:937)
           at org.eclipse.persistence.queries.CursoredStream.copy(CursoredStream.java:117)
           at org.eclipse.persistence.queries.CursoredStream.read(CursoredStream.java:327)
           at de.optware.dataloader.service.LieferantenstandortListService$1.run(LieferantenstandortListService.java:91)
           at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
           at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
           at java.util.concurrent.FutureTask.run(FutureTask.java:138)
           at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
           at java.lang.Thread.run(Thread.java:662)
      I am using eclipselink 1.1.2 and the ojdbc14 jdbc driver.

      Any ideas?

      Edited by: user12188472 on 05.05.2011 01:40

      Edited by: user12188472 on 05.05.2011 01:44