sylvainlaurent / JDBC-Performance-Logger

A JDBC driver wrapper and GUI to analyze statement performance
Apache License 2.0
84 stars 26 forks source link

[Help] How to use jdbc-perf-logger-driver with JBoss EAP 6.4 #63

Closed ivanmarban closed 6 years ago

ivanmarban commented 6 years ago

Can't figure out how to make jdbc perf logger work with JBoss. Any help would be appreciated.

I've added the driver as module in JBoss, and configured the datasource like this:

<datasources>
    <datasource jta="false" jndi-name="java:/jdbc/DBXX" pool-name="XXDS" enabled="true" use-java-context="true" use-ccm="false" statistics-enabled="true">
        <connection-url>jdbcperflogger:jdbc:oracle:thin:@localhost:1521:XX</connection-url>
        <driver-class>ch.sla.jdbcperflogger.driver.WrappingDriver</driver-class>
        <driver>jdbcperfloggerDriver</driver>
        <pool>
            <min-pool-size>10</min-pool-size>
            <max-pool-size>50</max-pool-size>
            <use-strict-min>true</use-strict-min>
            <flush-strategy>IdleConnections</flush-strategy>
        </pool>
        <security>
            <user-name>XXXX</user-name>
            <password>XXXX</password>
        </security>
        <validation>
            <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
            <validate-on-match>true</validate-on-match>
            <background-validation>false</background-validation>
        </validation>
        <timeout>
            <blocking-timeout-millis>30000</blocking-timeout-millis>
            <idle-timeout-minutes>5</idle-timeout-minutes>
            <query-timeout>300</query-timeout>
        </timeout>
        <statement>
            <track-statements>false</track-statements>
            <prepared-statement-cache-size>32</prepared-statement-cache-size>
            <share-prepared-statements>false</share-prepared-statements>
        </statement>
    </datasource>
    <drivers>
        <driver name="jdbcperfloggerDriver" module="jdbc.jdbcperflogger"/>
    </drivers>
</datasources>

I'm getting this error:

16:44:01,499 WARNING [ch.sla.jdbcperflogger.driver.WrappingDriver] (JCA PoolFiller) Cannot find driver class oracle.jdbc.OracleDriver for JDBC url jdbc:oracle:thin:@localhost:1521:XX: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver from [Module "jdbc.jdbcperflogger:main" from local module loader @f65612 (finder: local module finder @11d617d (roots: C:\servers\jboss-eap-6.4\modules,C:\servers\jboss-eap-6.4\modules\system\layers\base))] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:213) [jboss-modules.jar:1.3.6.Final-redhat-1] at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459) [jboss-modules.jar:1.3.6.Final-redhat-1] at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408) [jboss-modules.jar:1.3.6.Final-redhat-1] at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389) [jboss-modules.jar:1.3.6.Final-redhat-1] at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134) [jboss-modules.jar:1.3.6.Final-redhat-1] at java.lang.Class.forName0(Native Method) [rt.jar:1.8.0_31] at java.lang.Class.forName(Class.java:260) [rt.jar:1.8.0_31] at ch.sla.jdbcperflogger.driver.WrappingDriver.connect(WrappingDriver.java:103) at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:328) at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:304) at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:834) [ironjacamar-core-impl-1.0.31.Final-redhat-1.jar:1.0.31.Final-redhat-1] at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.fillToMin(SemaphoreArrayListManagedConnectionPool.java:775) [ironjacamar-core-impl-1.0.31.Final-redhat-1.jar:1.0.31.Final-redhat-1] at org.jboss.jca.core.connectionmanager.pool.mcp.PoolFiller.run(PoolFiller.java:97) [ironjacamar-core-impl-1.0.31.Final-redhat-1.jar:1.0.31.Final-redhat-1] at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_31]

sylvainlaurent commented 6 years ago

I don't know how jboss classloading works nowadays but the thing to understand is that the jdbc perf logger classes must be able to use the underlying jdbc driver (oracle in your case). If you manage to declare both jars to be in the same jboss "module" you should be ok

ivanmarban commented 6 years ago

Thanks for the tip. I've managed to use jdbc-perf-logger-driver in JBoss.

Just for the record, my declared module looks like this:

<module xmlns="urn:jboss:module:1.0" name="jdbc.jdbcperflogger">
    <resources>
        <resource-root path="jdbc-perf-logger-driver-0.8.3-SNAPSHOT.jar"/>
    <resource-root path="ojdbc6.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    </dependencies>
</module>