ambari-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jonathan Hurley (JIRA)" <j...@apache.org>
Subject [jira] [Created] (AMBARI-19364) Investigate Changing the Default Container Policy in JPA From Vector to ArrayList
Date Wed, 04 Jan 2017 16:39:58 GMT
Jonathan Hurley created AMBARI-19364:
----------------------------------------

             Summary: Investigate Changing the Default Container Policy in JPA From Vector
to ArrayList
                 Key: AMBARI-19364
                 URL: https://issues.apache.org/jira/browse/AMBARI-19364
             Project: Ambari
          Issue Type: Task
          Components: ambari-server
    Affects Versions: 2.5.0
            Reporter: Jonathan Hurley
             Fix For: 2.5.0


Recently I noticed that collections coming back from JPA were using a {{Vector}} as their
concrete collection. This seems very wrong as {{Vector}} is a completely synchronized collection.


Tracing through EclipseLink, it seems like this really only affects [ReadAllQuery|http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.persistence/eclipselink/2.5.2/org/eclipse/persistence/queries/ReadAllQuery.java/#68].
Essentially, EclipseLink uses  a [ContainerPolicy|http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.persistence/eclipselink/2.5.2/org/eclipse/persistence/internal/queries/ContainerPolicy.java#ContainerPolicy]
to determine how the result set should be collected. There are policies for {{Vector}}, {{ArrayList}},
{{HashSet}}, etc. 

The interesting part here is that this really only affects the {{ReadAllQuery}} which is used
by JPA's {{Query#getResultList()}} ... anytime it needs to create a collection of entities,
it's going to use a {{Vector}}.

There's actually very little documentation on this. In fact, the only way to change this is
either set a global value for the default container policy, or set a per-query policy. An
example of setting the global policy would be:

{code}
public class EclipseLinkSessionCustomizer implements SessionCustomizer {

  /**
   * {@inheritDoc}
   * <p/>
   * This class exists for quick customization purposes.
   */
  @Override
  public void customize(Session session) throws Exception {
    // ensure db behavior is same as shared cache
    DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
    databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_COMMITTED);

    // for some reason, read-all queries use a Vector as their container for
    // result items - this seems like an unnecessary performance hit since
    // Vectors are synchronized and there's no apparent reason to provide a
    // thread-safe collection on a read all query
    ContainerPolicy.setDefaultContainerClass(CoreClassConstants.ArrayList_class);
  }
}
{code}

This indeed causes collections returned by queries to be backed by ArrayLists. 

There is some discussion on this topic already:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=255634

It seems like this was kept as a {{Vector}} purely for backward compatibility reasons. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message