Version 7

    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




    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!




    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!






    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.





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





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