Hi All
In an effort to allow sharing of a connection pool across different
configurations (serverSessions), I am trying to use Universal Connection
Pool with Eclipselink. I am able to get the basic functionality working
using something like below:
1. Create a PoolDataSource
a. set the datasource parameters
2. set the PersistenceProvider using the following code:
PersistenceProviderResolverHolder.setPersistenceProviderResolver(
new MyPersistenceProviderResolver()); }
...
static class MyPersistenceProviderResolver implements
PersistenceProviderResolver {
public List<PersistenceProvider> getPersistenceProviders() {
List<PersistenceProvider> providers = new
ArrayList<PersistenceProvider>();
providers.add(new MyPersistenceProvider());
return providers;
}
public void clearCachedProviders() {
}
}
...
static class MyPersistenceProvider implements PersistenceProvider {
public EntityManagerFactory createContainerEntityManagerFactory(
PersistenceUnitInfo info, @SuppressWarnings("rawtypes")Map
map) {
return null;
}
public EntityManagerFactory createEntityManagerFactory(String
emName,
@SuppressWarnings("rawtypes")Map map) {
SEPersistenceUnitInfo puInfo = new SEPersistenceUnitInfo();
URL noopURL = null;
try {
noopURL = new URL(null, "noop:", new URLStreamHandler() {
protected URLConnection openConnection(URL url)
throws IOException {
return new URLConnection(url) {
public InputStream getInputStream() throws
IOException {
return null;
}
public void connect() throws IOException {
}
};
}
});
}
catch (Exception e) {
e.printStackTrace();
}
puInfo.setPersistenceUnitRootUrl(noopURL);
EntityManagerSetupImpl entityManagerSetupImpl =
new EntityManagerSetupImpl(PERSISTENCE_UNIT_NAME +
Math.random(), PERSISTENCE_UNIT_NAME + Math.random());
entityManagerSetupImpl.predeploy(puInfo, map);
return new EntityManagerFactoryImpl(entityManagerSetupImpl,
map);
}
public ProviderUtil getProviderUtil() {
return null;
}
}
3. Create the configuration with the following types:
EmpDep ed = new EmpDep();
Order order = new Order();
the Order constructor creates a serverSession which has a reference
to a DynamicType for "Order" table.
the EmpDep constructor creates a serverSession which has a reference
to DynamicTypes for "Employee", "Department" tables and their relationships.
Both these objects are connected to the same Datasource using
properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE,
datasource);
These classes have a printAll() method which does a SELECT * on the
tables. It acquires a client session to execute the query and then
releases it.
4. Now I do the following
order.printAll();
ed.printAll();
5. *The above code flow goes through fine. But if I swap the order of
initialization of the ed and order objects, I get the following exception*:
Query Key empinfo.depinfo
Base jpatest.empinfo is not valid, or for a mapping type that does
not support joining.
at
org.eclipse.persistence.exceptions.QueryException.mappingForExpressionDoesNotSupportJoining(QueryException.java:673)
at
org.eclipse.persistence.internal.queries.JoinedAttributeManager.prepareJoinExpression(JoinedAttributeManager.java:851)
To sum it up:
A.
EmpDep ed = new EmpDep();
Order order = new Order();
order.printAll();
ed.printAll();
works
B.
Order order = new Order();
EmpDep ed = new EmpDep();
order.printAll();
ed.printAll();
does not work
C.
EmpDep ed = new EmpDep();
Order order = new Order();
ed.printAll();
order.printAll();
does not work
D.
EmpDep ed = new EmpDep();
Order order = new Order();
order.printAll();
ed.printAll();
order.printAll(); // throws an error that we should log into the
session first.
Any idea why this behavior with the third party datasource also?
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
------------------------------------------------------------------------
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users