Hi,
ein Freund von mir und ich schreiben gerade unsere Diplomarbeiten an der RWTH Aachen. Unser Thema ist die Entwicklung eines Benchmarks für Datenbankzugriffsschichten (DBZ), wie z.B. Hibernate 3. Wir haben ein kritisches Problem mit Hibernate bei Verwendung von c3p0 als Connection Pool, da sich unser Logging Mechanismus nicht mit Multithreading im Connection Pool verträgt. Den in Hibernate eingebauten Pool wollen wir aus Performanz-Gründen nicht verwenden...
Systembild
Vlt zuerst eine kurz Übersicht zum Benchmark. Unser Benchmark simuliert ein multi-user System, deren Benutzer auf die DBZ Zugreifen. Jeder Benutzer wird auf einen eigenen Thread abgebildet. Die Benutzer nennen wir Zugriffsmuster (im Bild AccessPattern).
Die Aufgabe des Loggers ist es, jeden Aufruf eines Benutzers and die DBZ zu loggen, und dabei nicht nur die benötigte Zeit innerhalb der DBZ zu messen, sondern auch die Zeit die in der DB benötigt wurde für diesen Aufruf. Dafür muss der Logger jeden aus einem DBZ Aufruf resultierenden DB Aufruf dem DBZ Aufruf und dem Benutzer des Aufrufes zuordnen können. Z.B.: ein Aufruf an session.beginTransaction() erzeugt einen DB Aufruf getAutoCommit(). Diese beiden muss der Logger nicht nur einander, sondern auch dem korrekten Benutzer zuordnen können.
Weiterhin muss unser logging nicht-invasiv sein, d.h. wir dürfen keinen bestehenden Sourcecode verändern. Deswegen haben wir uns für Adapter entschieden.
Das Problem
c3p0, der von Hibernate bevorzugte Connection Pool, hält seine Connections in seperaten Threads(ThreadPoolAsynchronousRunner). Dadurch finden wir keine Möglichkeit, wie wir einen DBZ Aufruf mit den den daraus resultierenden DB Aufrufen in Verbindung bringen können.
Mit dem in Hibernate eingebauten Connection Pool ist dies kein Problem, aber laut Dokumentation soll dieser ja nicht verwendet werden aus Gründen der Performanz. Was können wir also tun?
Vielen Dank für eure Hilfe.
Mit freundlichen Grüßen,
Firat Alagöz