Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] OracleDataSource and threading (?) problems

Thanks. 2 more questions:

1) Is there a place to get the src for the 1.0.2 release specifically?

2) Does anybody have a netbeans project definition that works with the src tree? I can probably get it set up, but it always takes me a bit
of fiddling to get those things to work....

Thanks again.

- DAP

On Mar 3, 2009, at 10:07 AM, James Sutherland wrote:


This seems to be a bug in the query retry logic not checking if the exception
accessor is null,

databaseException.getAccessor().reestablishConnection(this);

This is masking the real exception that you are getting. Please log a bug for this. Also include in the bug that the original exception should be
logged before the retry.

If you can put a breakpoint or debug in the DatabaseException class, you should be able to see the real database exception that you are getting.



David Parker-8 wrote:

Thank you very much for the informative response.

We have no kind of container at all - not even tomcat, so the
DataSource being used is just created by the application, then the
various jdbc parameters are set on it. Perhaps my problem is with the
DataSource config rather than with eclipselink? I suspect I am doing
something ignorant there.....

I am running with eclipselink 1.0.2, btw.

Originally I made the EntityManagerFactory a static, which was working
OK. I tried making it a local thinking that that was causing the
problems, but it didn't make any difference.

The code that creates the EntityManagerFactory looks like this:

    protected EntityManagerFactory getEntityManagerFactory() {
        if (emf == null || !emf.isOpen()) {
            synchronized (emf_lock) {
                if (emf == null) {
                    DataSource ds = getDataSource(emfProps);
                    HashMap newprop = new HashMap();

newprop.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, ds);
                    emf =
Persistence.createEntityManagerFactory(puName, newprop);
                }
            }
        }
        return emf;
    }

The getDataSource is simple:

   private DataSource getDataSource(Map<String, String> props) {
        try {
            OracleDataSource ds = new OracleDataSource();

            //String driver = props.get(DBConstants.JPA_DRIVER_PROP);
            String url = props.get(DBConstants.JPA_URL_PROP);
            String user = props.get(DBConstants.JPA_USER_PROP);
String password = props.get(DBConstants.JPA_PASSWORD_PROP);

            //ds.setDriverType(driver);
            ds.setURL(url);
            ds.setUser(user);
            ds.setPassword(password);

            return ds;

        } catch (SQLException ex) {
            System.err.println("getDataSoure failed");
            return null;
        }
    }

Here is one of the stacks.

[EL Info]: 2009.02.26 16:23:40.526--UnitOfWork(803339)--Communication
failure detected when attempting to perform read query outside of a
transaction. Attempting to retry query.
java.lang.NullPointerException[EL Warning]: 2009.02.26 16:23:40.526--
UnitOfWork(1643286)--java.lang.NullPointerException

at
org
.eclipse
.persistence
.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:
1219)
at
org
.eclipse
.persistence
.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:
1162)
at
org
.eclipse
.persistence
.internal
.indirection
.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:77)
at
org
.eclipse
.persistence
.internal
.indirection
.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:67)
[EL Info]: 2009.02.26 16:23:40.528--UnitOfWork(803339)--Communication
failure detected when attempting to perform read query outside of a
transaction. Attempting to retry query.
at
org
.eclipse
.persistence
.internal
.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java: 83)
at
org
.eclipse
.persistence
.internal
.indirection
.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java: 161)
at
org
.eclipse
.persistence
.internal
.indirection
.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:230)
at
org
.eclipse
.persistence
.internal
.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java: 83)
at
org
.eclipse
.persistence.indirection.IndirectMap.buildDelegate(IndirectMap.java: 110)
at
org
.eclipse
.persistence.indirection.IndirectMap.getDelegate(IndirectMap.java: 314)
at
org.eclipse.persistence.indirection.IndirectMap.get(IndirectMap.java:
301)



On Mar 2, 2009, at 6:34 PM, Michael O'Brien wrote:

David,
 Hi,
 1) Yes, EclipseLink is able to run in both container-managed (JTA)
and application managed (RESOURCE_LOCAL) modes on any specific full
JEE container.
 Also, using a datasource from Tomcat within an SE JPA application
has been tested.
 Check that you are specifying the jta-data-source/non-jta-data-
source property and that you are ok with the fact that the
transaction-type defaults to JTA if not specified -when deployed to
the server and RESOURCE_LOCAL when on an SE client - this will
affect whether the datasource or db properties are used - if they
are still specified.

 For example, for details on setting up an Oracle datasource on
WebLogic see...

http://wiki.eclipse.org/EclipseLink/Examples/JPA/WebLogic_Web_Tutorial#JNDI_Datasource_Setup

 Depending on the container that your datasource is running on -
you will need extra configuration steps.  I assume that your
datasource is NOT application managed and that you are using a
globally defined datasource (no need for a deploy).
 For example when targeting Tomcat, you will need to reference the
catalina and ds support jars, set your InitialContext  factory and
prefixes, modify persistence.xml to use a non-jta-data-source and
setup the datasource on the server.

 2) For the NPE's, post the stacktrace and we will advise.
 Note: that the default behavior for picking up entities also
changes on/off the server and you may need to specify a combination
of <class> entries and/or <exclude-unlisted-classes> to pickup or
fine tune which entities are picked up.

 If you would like examples of how to configure your application
for a specific server, you may refer to the following examples by
server.  Most of the examples are using an Oracle JTA datasource.
http://wiki.eclipse.org/EclipseLink/Examples/JPA#JPA_Web_Application_Tutorials

 There are specific instructions for running an application managed
datasource for WebLogic
http://wiki.eclipse.org/EclipseLink/Examples/JPA/WLS_AppScoped_DataSource

 and in your particular situation, an example SE JPA app that uses
the JTA datasource on Tomcat 6.
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Using_JNDI_outside_the_Tomcat_container_for_J2SE_Applications

 For reference here is a RESOURCE_LOCAL SE JPA app that does not
use a datasource.
http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/examples/org.eclipse.persistence.example.jpa.server.common.ddlgen/

 Also, be aware that Catalina based server will require a
SessionCustomizer that modifies the lookupType on the connector to a
String type, see..
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Session_Customizer

 If you post a copy of your persistence.xml as well as your
overriding properties and the stack trace/log we will triage this
issue.
  - config details (Application server, Database, EclipseLink
version) part of persistence.xml and the logs
  - persistence.xml
  - property overrides
  - application managed *-oracle-ds.xml datasource definition
  - globally defined datasource definition
  - stacktrace
  - some specific example client code if you can (especially if
your client is multi-threaded)
  - EclipseLink [EL] logs on FINEST if possible (both Client and
Server if possible)

 thank you
 /michael

David Parker wrote:
We are using eclipselink in a server application, but there is no
container (j2ee, spring, etc) involved: our persistence environment
is completely application-managed.

The server has a single static EntityManagerFactory, and each serve
thread gets its own EntityManager.

This was all working fine when we were passing the low-level jdbc
properties (driver, url, user, password) in the map to create the
EntityManager, but we started having problems
when we tried to switch to using an OracleDataSource (we want to be
able to take advantage of Oracle RAC eventually).

The code now creates an EntityManager with a single item in the
property map, a pre-constructed DataSource object.

Unfortunately, we are now seeing random NPE's from deep in the
eclipselink stack. It has all the earmarks of a threading problem,
but all that has changed is the use of the DataSource.

Is DataSource usage fully supported in a non-containter
environment? Are there additional configuration steps that need to
be taken. Is anybody using OracleDataSource with eclipselink?

Thanks in advance for any clues.

===========================================
David Parker
david@xxxxxxxxxxxxxx
(401) 263-1782






-----
---
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland
http://www.eclipse.org/eclipselink/
EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink ,
http://wiki.oracle.com/page/TopLink TopLink
Forums: http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink ,
http://www.nabble.com/EclipseLink-f26430.html EclipseLink
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence
--
View this message in context: http://www.nabble.com/OracleDataSource-and-threading-%28-%29-problems-tp22298139p22310433.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.

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

===========================================
David Parker
david@xxxxxxxxxxxxxx
(401) 263-1782






Back to the top