Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jetty-users] 7.6.4: Switched to JNDI datasource instead of a ConnectionProvider, led to ClassLoader issues

Hi guys,

Environment: plain jetty 7.6.4 release on jdk7u3, with a webapp in webapps/MyWebapp.war and contexts/MyWebapp.xml. Followed docs on 'plus' configuration, running Jetty with "java -jar start.jar OPTIONS=plus".

I've been working through an upgrade to Hibernate 4, which led to my DBCP connection provider breaking - the Hibernate API has changed and no new DBCP solution seems on offer anywhere. In the process of fixing, I'm trying to move to the 'recommended' approach of using JNDI to define my data source. This is the first time I've got JNDI working with Jetty. I have a custom dialect class to deal with a couple of MySQL inconsistencies (e.g. http://stackoverflow.com/questions/8667965/found-bit-expected-boolean-after-hibernate-4-upgrade).

For some time I've run successfully with the Dialect .class file packaged in the webapp .war file along with the rest of my app. My question is how to package this file when using a JNDI defined DataSource.

*Old setup*: Hibernate driven webapp with:

<property name="hibernate.connection.provider_class">ltd.mycompany.db.dbcp.DBCPConnectionProvider</property> <property name="hibernate.dialect">ltd.mycompany.db.dialect.MyMySQLDialect</property>

The Hibernate session would use this connection provider to obtain each connection, so I think the ClassLoader being used for both the mysql driver and my MyMySQLDialect class were both the one used for the rest of the webapp. Thus MyMySQLDialect was found within the webapp .war.

*New setup*: jetty-env.xml defining a JNDI resource which is a com.mchange.v2.c3p0.ComboPooledDataSource.

It failed saying it couldn't load MyMySQLDialog.class. This seems to be because the ClassLoader being used is now one that cannot see the classes in my .war, because it's 'above' the one used for the .war in the ClassLoader hierarchy. If I create a little .jar with just ltd.mycompany.db.dialect.MyMySQLDialect.class in it, and drop it in $jetty_home/lib/ext, this problem goes away.

My question is, what's the best solution for making the Dialect class visible to the classloader, when using a JNDI datasource?

For now, it seems I must create a .jar to put in lib/ext just for this dialect class, which seems overkill and introduces deployment work that I'd like to avoid.

Any advice gratefully received :) I'm going to go and try to get my embedded jetty working with this JNDI setup, which is a different story.
Nick


Back to the top