Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Disabling EclipseLink Connection Pooling

Yes, this is exactly my solution for this problem.
But it's not an elegant one. Because the DataSource is specified in the session customizer, which has no access to the EntityManager creation properties (why not?), I came to the conclusion to use a static ThreadLocal to pass the correct Connection to my Datasource-Wrapper.
It works. But of course, this is everything else than elegant.

Things would be much easier and more clean if I could specify the exclusive connection during EntityManager creation.

Am 13.12.2010 19:37, schrieb Andrei Ilitchev:
Did you consider simply using your custom data source:

public class Customizer implements SessionCustomizer {
    public void customize(Session session) throws SQLException {
        MyDataSource ds = new MyDataSource();
        ds.setURL(session.getLogin().getConnectionString());
        session.getLogin().setConnector(new JNDIConnector(ds));
        session.getLogin().useExternalConnectionPooling();
    }
}

If you pass user/password to createEntityManager method then Eclipselink will obtain connection using ds.getConnection(user, password) so you could return correct wrapped connection.

The same data source would be used by read connection pool, too.
If you don't set user/password in persistence.xml (or createEMF method) then your data source would be called from read connection pool without user/password (ds.getConnection()).
In this case you could return a dummy connection.

On 12/13/2010 9:07 AM, patric@xxxxxxxxxxx wrote:
Thank you Andrei,

indeed this is a better way than my setPoolName(null) workaround.
But the optimal and most compatible solution would be a property like
"eclipselink.jdbc.internal-pooling" which can be set to false.

But:
Nevertheless the ServerSession will create and initialize at least the
read connection pool during connect(), which requires me to provide a
DataSource (to the JNDIConnector) for eclipselink even when I always use
the exclusive isolated client session mode to share a Connection with an
external transaction controller.
Is there a way to avoid this?

Best regards,
Patric


Zitat von Andrei Ilitchev <andrei.ilitchev@xxxxxxxxxx>:

You can pass custom ConnectionPolicy to createEntityManager method
using "eclipselink.jdbc.connection-policy" property.

On 12/10/2010 10:05 AM, patric@xxxxxxxxxxx wrote:

You should be able to pass user/password/url/driver as properties to
createEntityManager method without any additional customization
required.

Yes, but this is not my case of the eclipselink integration.
For historical reasons, a project on which I work on is using a
proprietary ConnectionPooling/Transaction management system.

This transaction object has a write connection which all JPA operations
has to use.
We need to do this, because the write connection can be dirty so
EclipseLink can see previous flushed data modifications in the
uncomitted transaction.

With some workarounds I was able to get this work with EclipseLink
1.1.2, but EclipseLink 2.1.1 need additional adjustments, because it's
very tricky to disable eclipselinks connection pool behaviour. After
hours of debugging and studying EclipseLink's source, I found out that

//code needs to be part of a session customizer
session.getLogin().setUsesExternalConnectionPooling(true);

and

//code needs to be placed after entity manager creation
((ClientSession) ((EntityManagerImpl) (em))
.getUnitOfWork().getParent()).getConnectionPolicy().setPoolName(
null);

did more or less satisfy me in disabling EclipseLink connection pools
and give me the control over the connection which will be used by
EclipseLink.

It would be very helpflul for future releases to do this easier and in a
more convenient and compatible way. (e.g. property inside
persistence.xml)

Best regards
Patric


Zitat von Andrei Ilitchev <andrei.ilitchev@xxxxxxxxxx>:

You should be able to pass user/password/url/driver as properties to
createEntityManager method without any additional customization
required.

Eclipselink still requires "main" data source (or
user/password/url/driver) to be connected at a start up - because you
will never use it just create a "dummy" (but really existing in the
db) user and list it in your persistence.xml

On 12/10/2010 7:22 AM, patric@xxxxxxxxxxx wrote:
I am having a similar problem with eclipselink 2.1.1.
I also want to disable the eclipselink connection pool because I
want to
provide the correct Connection by Properties during EntityManager
creation. (exclusive isolated session mode)

My session customizer is always called (it's defined in the
persistence.xml), but unfortunately, this doesn't help, because the
connection pool configuration is set before the session customizer
fires
(see EntityManagerSetupImpl.java:859 which will lead to
ServerSession.java:187).

All this end up that acquireClientConnection()
(ServerSession.java:252)
will enter the "connection pool mode"-branch.

When I replace EclipseLink 2.1.1 jar with EclipseLink 1.1.2 jar and do
not change anything else, the other branch inside
acquireClientConnection() (disabled connection pool) is used.

So something changed from EclipseLink 1.1.x to 2.x - maybe by
accident?

Best regards,
Patric

Zitat von Zarar Siddiqi <zarars@xxxxxxxxx>:

Looked into this more, and as Andrei suggested, the customizer is
randomly
being called (or not called). It's quite weird. Is there another
way to
specify a session customizer? Looked through the docs and couldn't
find
much.




On Wed, Dec 8, 2010 at 10:55 AM, Andrei Ilitchev
<andrei.ilitchev@xxxxxxxxxx
wrote:

I you sure that your customizer is called?


On 12/8/2010 10:07 AM, Zarar Siddiqi wrote:

Thanks for the reply, but that didn't do it.

I downloaded the source and debugged it to the point where I see
the
following call on line 104 in DatabaseLogin.java:

this.useDefaultDriverConnect();

That's the which is calling this method:

public void useDefaultDriverConnect() {
setConnector(new DefaultConnector());
}


which is causing the DefaultConnector to be set.

I tried searching for a dontUseDefaultDriverConnect() method but
can't
find it.

Still stuck. Will look into it more but if something jumps out, do
let
me know.

Thanks,





On Tue, Dec 7, 2010 at 10:06 PM, Michael O'Brien
<michael.obrien@xxxxxxxxxx <mailto:michael.obrien@xxxxxxxxxx>>
wrote:

Zarar,
May help - try setting the new connector on both the read and
write connection pool, as it looks like the failure is due to
DefaultConnector deferring to using RESOURCE_LOCAL jdbc properties
for a direct connection.

JNDIConnector readConnector =

(JNDIConnector)((DatabaseLogin)((ServerSession)session).getReadConnectionPool().getLogin()).getConnector();




or


(JNDIConnector)((DatabaseLogin)((ServerSession)session).getReadConnectionPool().getLogin()).setConnector(new



JNDIConnector(dataSource));

thank you
/Michael


On 2010-12-07 17:33, Zarar Siddiqi wrote:

Using 2.1.1. Trying to completely disable connection pooling by
EclipseLink as it's handled externally, but I randomly get the
following exception where it tries to get a connection on its own
but fails.

Exception Description: Unable to acquire a connection from driver
[null], user [null] and URL [null]. Verify that you have set the
expected driver class and URL. Check your login, persistence.xml
or sessions.xml resource. The jdbc.driver property should be set
to a class that is compatible with your database platform
at

org.eclipse.persistence.exceptions.DatabaseException.unableToAcquireConnectionFromDriverException(DatabaseException.java:376)



at

org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:91)





In my session customizer I have:

session.getLogin().setConnector(new
JNDIConnector(dataSource)); // I get dataSource from Spring
session.getLogin().useExternalConnectionPooling();

My persistence.xml looks like:

<persistence xmlns="http://java.sun.com/xml/ns/persistence";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd";
version="2.0">
<persistence-unit name="db">
<properties>
<property name="eclipselink.target-database"
value="ca.utoronto.sis.sws.db.ExtendedDB2MainframePlatform"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.logger"
value="SLF4JSessionLog"/>
<property name="eclipselink.session.customizer"
value="EclipseLinkSessionCustomizer"/>
</properties>
</persistence-unit>
</persistence>


Any idea why it's trying to go and do this on its own when I tell
it not to?

Thanks,


_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
<mailto:eclipselink-users@xxxxxxxxxxx>

https://dev.eclipse.org/mailman/listinfo/eclipselink-users



_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
<mailto:eclipselink-users@xxxxxxxxxxx>

https://dev.eclipse.org/mailman/listinfo/eclipselink-users




--
Zarar Siddiqi
416-737-9024



_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users




--
Zarar Siddiqi
416-737-9024





_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users





_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users





_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top