Kurt,
I agree that this is very common usage of the JPA programming model.  And,
we are not aware of any memory leaks.  About the only thing that jumps out
at me is the following two lines:

                apiAuthToken = new org.uddi.api_v3.AuthToken();
                MappingModelToApi.mapAuthToken(modelAuthToken,
apiAuthToken);

What do these do?  Can you comment these out and see if the memory leak
still exists?  Since you are passing the modelAuthToken into this method, I
don't know what it's doing with the reference and could it be holding onto
something to prevent the GC from cleaning up?

The rest of your example seems very straight forward with creating and
persisting objects.

Kevin

On Wed, Jan 13, 2010 at 2:09 PM, Rick Curtis <[email protected]> wrote:

> If you change the 1000 to something like 1000000... does your application
> go
> OOM? Are you running in a JSE environment? What is PersistenceManager?
>
> On Wed, Jan 13, 2010 at 2:05 PM, Kurt T Stam <[email protected]> wrote:
>
> > BTW I'm running with the cache off
> >
> > <property name="openjpa.DataCache" value="false"/>
> >
> > (that turns it off right?)
> >
> > --Kurt
> >
> >
> >
> > Kurt T Stam wrote:
> >
> >> Hi guys,
> >>
> >> [DESCRIPTION] The code below inserts a 1000 records in the database.
> >>
> >> for (int i=1; i<1000; i++) {
> >>           EntityManager em = PersistenceManager.getEntityManager();
> >>           EntityTransaction tx = em.getTransaction();
> >>           try {
> >>               tx.begin();
> >>                   // Generate auth token and store it!
> >>               String authInfo = AUTH_TOKEN_PREFIX + UUID.randomUUID();
> >>               org.apache.juddi.model.AuthToken modelAuthToken = new
> >> org.apache.juddi.model.AuthToken();
> >>               if (authInfo != null) {
> >>                   modelAuthToken.setAuthToken(authInfo);
> >>                   modelAuthToken.setCreated(new Date());
> >>                   modelAuthToken.setLastUsed(new Date());
> >>                   modelAuthToken.setAuthorizedName(publisherId);
> >>                   modelAuthToken.setNumberOfUses(0);
> >>                   modelAuthToken.setTokenState(AUTHTOKEN_ACTIVE);
> >>                     em.persist(modelAuthToken);
> >>               }
> >>                 apiAuthToken = new org.uddi.api_v3.AuthToken();
> >>                 MappingModelToApi.mapAuthToken(modelAuthToken,
> >> apiAuthToken);
> >>                 tx.commit();
> >>                         } finally {
> >>               if (tx.isActive()) {
> >>                   tx.rollback();
> >>               }
> >>               em.clear();
> >>               em.close();
> >>           }
> >>       }
> >>
> >>
> >> [ISSUE]
> >> After it leaving this code I end up with a 1000
> >> org.apache.juddi.model.AuthToken objects in memory. I've been using the
> >> profiler, and these objects cannot be garbage collected.
> >>
> >> This seems to be pretty the most common use case of using an OR-mapping
> >> tool, so I find it hard to believe openjpa has a memory leak here. Does
> >> anyone see what I'm doing wrong? Or can someone point me to an example
> that
> >> does not exhibit this behavior? BTW same code using hibernate does not
> >> accumulate these objects.
> >>
> >> We're using openjpa 1.2.1.
> >>
> >>
> >> Thx,
> >>
> >>
> >> Kurt
> >>
> >> Apache jUDDI.
> >>
> >
> >
>
>
> --
> Thanks,
> Rick
>

Reply via email to