Previous Section: Introduction to p6spy

p6spy

p6spy is a generic solution for tracing SQL requests in applications that use the Java Database Connectivity (JDBC) interface. It is slightly more advanced than the native Weblogic trace tool. The program is open source and can be downloaded from: http://www.p6spy.com/. it is also worth considering JDBInsight, a commercial product that offers some interesting advanced functionality.

2.1 Installation Under Weblogic

  • copy the files: p6spy.jar and spy.properties to the target server
  •  make sure that spy.properties is in a directory included in the JAVACLASSPATH
  • add p6spy.jar to the WEBLOGICCLASSPATH
  • edit the weblogic properties file and search for the property weblogic.jdbc.connectionPool, note on later versions of Weblogic you will need to do this through the administration console as direct access to weblogic.properties is not allowed
  • comment out the existing driver by putting a '#' at the start of the line
  • replace the driver with the one supplied with p6spy
    driver=com.pspy.engine.spy.P6SpyDriver
  • edit spy.properties and replace the property: realdriver with the driver you commented out in the weblogic properties file, for example:
    realdriver=oracle.jdbc.driver.OracleDriver
  • restart Weblogic

It is possible to replace up to 3 connection pools utilising the virtual driver : com.pspy.engine.spy.P6SpyDriver2 / realdriver2 etc.

Run the tail command (Unix/Cygwin) on the spy.log file which you can find in the startup directory of Weblogic. You will see logs similar to the following each time the Java application access the database:

1038568825766|0|1|rollback||
1038568825777|4|9|statement|SELECT U.IDENT FROM USER_TABLE E, STATEMENT_TABLE U WHERE U.IDENT = E.IDENT AND U.SOCIAL_SECURITY_NUM = ? AND E.EX_NUMBER = ? |SELECT U.IDENT FROM USER_TABLE E, STATEMENT U WHERE U.IDENT = E.IDENT AND U.SOCIAL_SECURITY_NUM = '24071964665659410' AND E.EX_NUMBER = '11113946600012'
1038568825765|0|1|commit||
1038568825766|0|1|rollback||

The trace gives the following information, each field is separated by a "|" symbol:

  • The current time, it is obtained from the method: System.getCurrentTimeMillis() and gives the number of  millisecondes since the 1st of January 1970. You can modify the format using the dateformat property in the file spy.properties.
  • Temps d'exécution : c’est le temps passé pour que cette méthode s'exécute. Il est important de noter que ceci n'est pas tout le coût d’une commande SQL. Par exemple, un SQL pourrait être exécuté comme commande préparée (prepared statement), dans lequel la méthode : execute() est calculée. Ceci est enregistré comme : « statement » dans la colonne 4. De plus, chaque fois vous appelez la méthode next() sur la Java objet : ResultSet, pour récupérer les données, les appels sont enregistrés comme : result dans la même colonne.
  • Catégorie : il y a actuellement trois catégories: debug, statement (les commandes SQL) et result (le résultat). Vous pouvez contrôler cette trace avec le fichier spy.properties.
  • Commande SQL virtuelle : c'est la commande SQL passée vers JDBC par l’application. Si c'est une commande préparée, ce sera avant que les paramètres soient mis en place.
  • Commande SQL réelle : pour la commande préparée, cette colonne montre le SQL qui est vraiment exécuté par la base de données.

En analysant le SQL, il est important de lier les requêtes SQL à des EJBs ou à des Servlets et de les grouper par des unités de travail (transactions). Les fabricants de base de données fournissent un certain nombre d'outils pour analyser le SQL.

2.2 Installation Under Websphere 4.0

Assurer que le driver JDBC est configure dans le server Websphere comme un DataSource. Le process de configuration consiste de « cloner » le Provider existant et rederiger les requettes SQL par cette Provider qui utilise le driver p6spy.

  • Demarrer le Websphere adminclient, par exemple:
    ./adminclient.sh udgir169 11220
  • Ouvrir l’aborescence :Resouces
  • Ouvrir l’aborescence : JDBC Providers
  • Ouvrir l’aborescence du Provider que vous veuillez espionne
  • Clicke sur le repertoire ‘data source’
  • Dans l’onglet « general » noter le JDNI Name, l’URL, le nom d’utilisateur et le mot passe (normalment remplacer avec les #, demandez au administrateur de base des donnees)
  • Changez le « JNDI name » par exemple, ajoute un X_ : jndi/X_ftESource
  • Clicke droit sur le JDBC provider et clicke « New »
  • Dans l’onglet « Nodes » selectionne le node, clicke sur le bouton « Specify Driver » et parcourir a p6spy.jar.
  • Clicke sur « Install »
  • Dans l’onglet General entre l’information suivant :
    Name : P6SpyDriver
    Implementation class : com.p6spy.engine.spy.P6ConnectionPoolDataSource
  • Clicke sur « OK »
  • Normallement un dialogue s’affichie qui confirme le manipulation
  • Clicke sur « OK »
  • Selectionne le repertoire « Data Sources » pour le nouveau Provider, entre le JNDI name noter au dessous, par example : jndi/ftESource
  • Sauvgarder le configuration
  • Configurez le fichier spy.properties qui se trouve dans le repertoire : properties, avec l’information que vous avez noter en haut :

    realdatasource = jdbc/X_ftESource
    realdatasourceclass = oracle.jdbc.pool.OracleConnectionPoolDataSourceourceclass
    realdatasourceproperties = user;esplus,password;esplus,URL;jdbc:oracle:thin:udgir169:20011:P44SDB
    realdriver = oracle.jdbc.driver.OracleDriver
  • redemarrer WebSphere

L’installation est terminer, vous pouvez utiliser le bouton « Test Connection » dans le onglet General dans le repertoire Data Sources pour tester chaque connection. Quand vous utiliser votre application un fichier spy.log est créer dans le repertoire de demarrage de WebSphere. Vous pouvez configurer spy.log comme avec WebLogic.

A Noter : selon le version de WebSphere vous pouvez avoir des ennuis avec les ‘2 phase commits’ parce que il y a maintenant deux drivers qui est utilise avec chaque requete. En ce cas il faut remplace le realdatasourceclass avec : oracle.jdbc.xa.client.OracleXADataSource, pour Oracle et faire le meme manipulation pour le Provider que vous espionne.