prism.js

2014. március 4., kedd

Hibernate SQL logging = jBoss 7 + log4jdbc + JNDI + JPA + logback

Maga a JPA nem teszi lehetővé a pontos adatbázis felé történő kommunikációt, csak annyit amennyit a persistence.xml fájban állíthatunk:
<persistence version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence" xsi:schemalocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="primary" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <jta-data-source>java:/jdbc/primary</jta-data-source>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"></property>
            <property name="hibernate.hbm2ddl.auto" value="none"></property>
            <property name="hibernate.show_sql" value="false"></property>
            <property name="hibernate.format_sql" value="true"></property>
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"></property>
            <property name="hibernate.connection.release_mode" value="auto"></property>

            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"></property>

        </properties>
    </persistence-unit>
</persistence>
Ez sok esetben nem elegendő, mert nem látszódnak a felhasznált paraméterek, visszatérő értékek és típusai, stb...
Erre nagyon nagyon jó szolgálhat a log4jdbc. Ha a projektünket jBoss-ban definiált JNDI datasource-kkal használjuk akkor a kódunk érintettlen maradhat, nem kell hozzárakni semmi csomagot és konfigot.
Elősször is le kell szedni a log4jdbc oldalról a jar fájlt, és bele rakni a jBoss modules közé (létrehozzuk az útvonalat és bemásoljuk a jar fájlt és létrehozzuk a module.xml fájlt):
<module name="com.googlecode.log4jdbc" xmlns="urn:jboss:module:1.1">
  <resources>
    <resource-root path="log4jdbc4-1.2.jar">
  </resource-root></resources>

    <dependencies>
    <module name="org.slf4j"></module>
    <module name="javax.api"></module>
    <module name="javax.transaction.api"></module>
    <module name="com.oracle"></module>
    </dependencies>
</module>
A kiemelt sorba olyan adatbázis dependencia kell, melyet használunk. Az én esetemben ez Oracle.
Most a jBoss standalone.xml-ben kell aktiválni a log4jdbc-t:
<server xmlns="urn:jboss:domain:1.2">
    <extensions>...</extensions>
    <system-properties>
        <property name="logback.configurationFile" value="c:/logback.xml">
        <property name="log4jdbc.drivers" value="oracle.jdbc.OracleDriver">
        <property name="log4jdbc.auto.load.popular.drivers" value="false">
    </property></property></property></system-properties>
    <management>...</management>
    <profile>...
        <subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource enabled="true" jndi-name="java:/jdbc/primary" jta="true" use-ccm="true">
                    <connection-url>jdbc:oracle:thin:@//192.168.1.100:1521/DB</connection-url>
                    <driver>oracle</driver>
                </datasource>
                <drivers>
                    <driver module="com.oracle" name="oracle">
                        <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        <xa-datasource-class>oracle.jdbc.OracleDriver</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>
        ...
    </profile>
    ...
</server>
<server xmlns="urn:jboss:domain:1.2">
    <extensions>...</extensions>
    <system-properties>
        <property name="logback.configurationFile" value="c:/logback.xml">
        <property name="log4jdbc.drivers" value="oracle.jdbc.OracleDriver">
        <property name="log4jdbc.auto.load.popular.drivers" value="false">
    </property></property></property></system-properties>
    <management>...</management>
    <profile>
        ...
        <subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource enabled="true" jndi-name="java:/jdbc/primary" jta="true" use-ccm="true">
                    <connection-url>jdbc:log4jdbc:oracle:thin:@//192.168.1.100:1521/DB</connection-url>
                    <driver>log4jdbc</driver>
                </datasource>
                <drivers>
                    <driver module="com.oracle" name="oracle">
                        <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        <xa-datasource-class>oracle.jdbc.OracleDriver</xa-datasource-class>
                    </driver>
                    <driver module="com.googlecode.log4jdbc" name="log4jdbc">
                        <driver-class>net.sf.log4jdbc.DriverSpy</driver-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>
        ...
    </profile>
    ...
</server>
Mostmár csak a loggolás beállítása maradt hátra. Az én esetemben logback van használva, external konfig fájból, így az applikáció teljesen érintetlen a JDBC aktiválásától:
<configuration debug="true" scan="true">

  <appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- log4jdbc sql & jdbc logging -->
  <logger additivity="false" name="jdbc.sqlonly">
    <level value="INFO">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>
  <logger additivity="false" name="jdbc.sqltiming">
    <level value="INFO">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>
  <logger additivity="false" name="jdbc.audit">
    <level value="INFO">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>
  <logger additivity="false" name="jdbc.resultset">
    <level value="INFO">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>
  <logger additivity="false" name="jdbc.connection">
    <level value="INFO">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>
  <logger additivity="false" name="log4jdbc.debug">
    <level value="DEBUG">
  <appender-ref ref="STDOUT">
  </appender-ref></level></logger>

 <root level="trace">
  <appender-ref ref="STDOUT">
 </appender-ref></root>

</configuration>
Itt egy hasonló példa http://sfleiter.github.io/blog/2013/12/08/jboss-datasource-proxy-with-log4jdbc-log4j2/

Nincsenek megjegyzések:

Megjegyzés küldése

prism.js

Hibernate SQL logging = jBoss 7 + log4jdbc + JNDI + JPA + logback

Maga a JPA nem teszi lehetővé a pontos adatbázis felé történő kommunikációt, csak annyit amennyit a persistence.xml fájban állíthatunk: <...