package org.genedb.db.loading;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.SQLException;
/**
* This was useful for debugging a problem with database connection usage.
* It just adds some simple logging ot the DBCP BasicDataSource. Currently
* the Test configuration uses this as its dataSource.
* <p>
* The utility of this class is fairly limited. When we're sure the connection
* problems have been cleared up, it can be removed.
*
* @author rh11
*
*/
public class LoggingDataSource extends BasicDataSource {
private static final Logger logger = Logger.getLogger(LoggingDataSource.class);
private boolean logStackTrace = false;
private boolean neverLogStackTrace = false;
public void setLogStackTrace(boolean logStackTrace) {
this.logStackTrace = logStackTrace && !neverLogStackTrace;
}
public void setNeverLogStackTrace(boolean neverLogStackTrace) {
this.neverLogStackTrace = neverLogStackTrace;
if (neverLogStackTrace) {
logStackTrace = false;
}
}
@Override
public synchronized void close() throws SQLException {
logger.trace(String.format("close [active=%d, idle=%d]", getNumActive(), getNumIdle()),
logStackTrace ? new Throwable("Stack trace") : null);
super.close();
}
@Override
public Connection getConnection() throws SQLException {
boolean logStackTrace = !this.neverLogStackTrace
&& (this.logStackTrace || getNumActive() > 0);
logger.trace(String.format("getConnection [active=%d, idle=%d]", getNumActive(), getNumIdle()),
logStackTrace ? new Throwable("Stack trace") : null);
return super.getConnection();
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
logger.trace(String.format("getConnection(%s, %s)", username, password),
logStackTrace ? new Throwable("Stack trace") : null);
return super.getConnection(username, password);
}
}