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)