Logging in DBCP

Viewed 7171

I'm using Apache Commons DBCP. There is a task to track the inner behavior of the DBCP - number of active and idle connections.

I found out that DBCP lacks any such logging at all. Yes, tt is possible to write the code that outputs the status of the BasicDataSource when connection is borrowed from the pool. However there is no way to track the status of the BasicDataSource when connection is returned or closed, because connection object knows nothing about the pool.

Any ideas?

4 Answers

DBCP's BasicDataSource contains a few protected methods that actually create the pools and the pool factories. You can subclass it and override those methods to change the behavior; for example, to get a hold of the pool factory or replace it with your own. Once you have that pool, you can then get at the pool state within your code.

AOP is the way to go for tracking connection usage from the pool. However, its not very straight forward. You need to do the following:

  1. Create a ConnectionWrapper class that wraps (Decorator pattern) Connection and overrride the close() method to additionally log the connection id, thread id and action 'close'
  2. Intercept the getConnection() method of the datasource.
  3. In that method, log the connection id, thread id and action 'open'
  4. In the same method, decorate the original connection and return your ConnectionWrapper instance

With this setup, you can track both the borrow & return of the connection from/to the pool.

Related