26. September 2007

J2SE Versionen

Jedes .class-File hat folgenden Aufbau:

ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
...
}

Beispiel:

CA FE BA BE 00 00 00 30


Also ergibt sich die Hex-Version 30.0, das entspricht dezimal 48,
also der JDK-Version 1.4



Java-Version Byte-Code-Version
1.0 45.0 (00 00 00 2D)
1.1 45.3 (00 03 00 2D)
1.2 46 (00 00 00 2E)
1.3 47 (00 00 00 2F)
1.4 48 (00 00 00 30)
5.0 (1.5) 49 (00 00 00 31)
6.0 (1.6) 50 (00 00 00 32)

DBCP-Logging in Tomcat

Beim Tomcat kann man wie folgt Connection-Pooling über DBCP einrichten. Dabei ist es möglich
Connections, die nicht mehr geschlossen werden nach einer bestimmten Zeit zu schließen (removeAbandoned). Zusätzlich kann ein Stacktrace der Codestelle geloggt werden, die das Problem verursacht hat (logAbandoned)

<Resource name="jdbc/MyDB2"
scope="Shareable"
type="javax.sql.DataSource"
auth="Container"
url="jdbc:db2:mydb2"
maxIdle="10"
maxOpenPreparedStatements="50"
maxActive="50"
validationQuery="Select name from test FETCH FIRST 1 ROWS ONLY FOR FETCH ONLY"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="600000"
driverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
maxWait="10000"
username="user"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
poolPreparedStatements="true"
password="pass"
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true"
/>

Das Problem mit DBCP ist, dass diese Logausgabe über System.out rausgeschrieben werden und nicht über ein Logging-Framework. Daher muss beim Starten des Tomcats dessen Ausgabe einfach in eine File geschrieben werden:


bin\catalina run >logs_tomcat\console-out-%date%.log


Erzeugt z.B. folgende Ausgabe:

DBCP object created 2007-09-26 12:03:40 by the following code was never closed:
java.lang.Exception
at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:157)
at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:76)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at de.rfeest.test.db.ConnectionOpenerJNDIImpl.createConnection(Unknown Source)
at de.rfeest.test.db.Executor.openConnection(Unknown Source)

24. September 2007

Timestamps in DB2-Sql-Abfragen

Timestamps werden in folgendem Format erwartet:

timestamp(yyyy-mm-hh-hh.mm.ss.sss)

Beispiel

select * from mytable where
mytimestamp = timestamp('2007-09-20-14.45.14.394')

18. September 2007

UTF-8 für Log4J-Logfiles

Problem: Es sollen in Log4J-Logfiles UTF-8 geschrieben werden.
Lösung: Definition des Parameters "Encoding"

<appender name="DEBUG_MAIL"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/mail.log" />
<param name="MaxFileSize" value="2500000" />
<param name="MaxBackupIndex" value="1" />
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %-4r [%t] %-5p (%c:%L) %x - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>