IWantToDeployMyOwnJdbcDriverInAScopedClassloader

    I want to deploy my own jdbc driver in a scoped classloader

     

    I've added my jdbc driver to a scoped deployment but it fails to create the datasource

    with all sorts of classloading problems.

     

    JDBC API Flaw

     

    The JDBC api is fundamentally flawed when it comes to classloading.

     

    This is mainly due to java.sql.DriverManager being a global singleton,

    but it also has problems due to internal caching.

     

    The caching is due to the hacky way that JDBC handles security,

    see the javadoc discussion

    on classloaders/applets.

     

    Error Messages

     

    Possible error messages you may see when attempting to deploy a JDBC driver in a scoped classloader.

     

    Error deploying a MySQL driver to JBoss 4.0.3.SP1

     

    org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: com.mysql.jdbc.Driver, url: jdbc:mysql://localhost:3306/testdb

     

    Workaround

     

    To make it work properly, you need to make sure that everything is in the same classloader.

    That means deploying the JBoss local jdbc rar (deploy/jboss-local-jdbc.rar) and at least

    its support classes (lib/jboss-common-jdbc-wrapper.jar) in your scoped deployment.

     

    Full solution

     

    Lobby the JCP to fix the broken java.sql.DriverManager api (but hell is likely to

    freeze over first!

     

    Aside

     

    This "bug" also makes it impossible to hot-deploy jdbc drivers that are not in scoped deployments.

    You get ClassCastExceptions if you try it, with no way to fix it because you the DriverManager

    won't flush its cache until the classloader is garbage collected. i.e. for the main shared

    classloader repository of JBoss this is never!

     

    -


     

    Examples

     

    To deploy a MySQL datasource to JBoss 4.0.3.SP1 in a scoped classloader: -

     

      Include the resource adapter archive 'jboss-local-jdbc.rar' to the ear and reference it within the application.xml, e.g.

       

     

      <module><connector>jboss-local-jdbc.rar</connector></module>

     

      Also add the MySQL driver to the ear and again reference it within the application.xml, e.g.

     

     

      <module><java>mysql-connector-java.jar</java></module>

     

      Finally add the -ds.xml to the ear and reference it from the jboss-app.xml, e.g.

     

     

      <module><service>mysql-ds.xml</service></module>