2010-08-04 12 views
6

Für ein Sicherheitssystem, das wie ein großer Bruder funktioniert (wie eine überwachte obligatorische Zugriffskontrolle), müssen wir alle ausgewählten Anweisungen abfangen und verarbeiten, die hibernate generiert. Wir speichern den Benutzer, den Zeitstempel und die SQL-Auswahl in einer Datenbank, um Profiling mit anderen Tools zu ermöglichen. Die Informationen erlauben zu bestimmen, was ein Benutzer zu sehen versucht. Für die Select-Anweisungen sind die vorbereiteten Eigenschaften wertvoll. Wir benötigen die vollständige SQL-Anweisung einschließlich aller Parameter.Wie man den Hibernate generierten SQL abfängt?

Gibt es einen Listener oder Interceptor, an dem wir all diese Dinge tun können? Das größte bisher ungelöste Problem ist das Sammeln der Aussageparameter.

Danke

+0

mkyong behauptet, dass die p6spy.jar die Hibernate-Abfragen mit Parameterwerten anzeigt. Wahrscheinlich können Sie dies versuchen http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/ – Naveen

Antwort

3

Die aktuellen Parameterwerte werden zufällig zur Verfügung gestellt (nach meinem Wissen), wenn die Protokollierungsebene der org.hibernate package is set to DEBUG, and with the hibernate.show_sql property set. Verwenden Sie einen JDBCAppender, wenn Sie die Loggerausgabe in der Datenbank selbst wollen.

Alternativ Sie einen Blick auf die log4jdbc project nehmen könnte, die die folgenden Ansprüche:

Im angemeldet Ausgabe vorbereitet Aussagen sind die bind Argumente automatisch in die Ausgabe SQL eingefügt. Dies verbessert Lesbarkeit und Debugging für viele Fälle.

Wenn das nicht geeignet ist, könnten Sie untersuchen, ob P6Spy can be used in your situation. Auf WebLogic Server wird die entsprechende Funktionalität über die WebLogic JDBC Spy erreicht, die mit den WebLogic JDBC-Treibern für bestimmte Datenbanken ausgeliefert wird. Beide schreiben in System.out und nicht in eine Datenbank (es sei denn, ich täusche mich), also könnte es nicht so nützlich sein.

+0

Das funktioniert sehr gut, ich habe meinen eigenen Appender geschrieben, um die Anweisungen in die Datenbank zu schreiben. Der einzige Punkt, der mir im Weg steht, ist, wie man den entsprechenden Benutzer, der diese Anweisung ausgelöst hat, bekommt. Dies ist fast unmöglich zu lösen. Irgendwelche Ideen? – codevour

+1

Ich bin mir nicht sicher, wie ich das nicht ausprobiert habe. Im Grunde müssen Sie den Benutzer/Prinzipal, der die SQL-Anweisung ausführt, den Daten zuordnen, die protokolliert werden. In SLF4J/log4j/logback wird dies durch MDC - Mapped Diagnostic Context erreicht. Ihre Musterzeichenfolge muss ebenfalls geändert werden, um dem Prinzipal zu entsprechen. Der Artikel über den Einsatz von MDC im Logback könnte helfen - http://logback.qos.ch/manual/mdc.html Übrigens würden Sie MDC nicht benötigen, wenn die Appender Pattern-Zeichenfolge geändert werden kann, um den Benutzer widerzuspiegeln (wenn es sich um eine fehlende Formatzeichenfolge handelt). –

+0

Vielen Dank, ich entschied mich für das log4jdbc Projekt, da es das aktivste ist, das hat sehr gut funktioniert. Danke noch einmal. – codevour

3

Sie können Interceptor.prepareSQL() (3.1+) vorbereiteten Anweisungen abfangen.

Ich glaube nicht, dass Sie die tatsächlichen Parameter erhalten können, ohne in der Abstraktionsschicht zu gehen. Eine mögliche Lösung wäre die Verwendung eines JDBC-Proxy-Treibers (siehe P6Spy).

Hoffe, dass hilft.

+0

Ja, diese Schnittstelle zu wissen, wo die begrenzten Parameter zu bekommen? Soweit ich weiß, gibt es keine Möglichkeit, die tatsächlichen Parameter zu erhalten. – codevour

+0

Um genau zu sein, ist es "Interceptor # onPrepareStatement (String sql)". Dadurch haben Sie jedoch Zugriff auf die SQL-Zeichenfolge, die vorbereitet wird, und nicht auf die * generierte * Abfrage. –

Verwandte Themen