package ddth.dasp.common.logging;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ddth.dasp.common.RequestLocal;
public class JdbcConnLogger {
private final static Logger LOGGER = LoggerFactory
.getLogger(JdbcConnLogger.class);
private final static String REQUEST_LOCAL_KEY = "JDBC_CONN_LOG";
@SuppressWarnings("unchecked")
private static Set<Connection> getLogs(RequestLocal requestLocal,
boolean createIfNotExist) {
if (requestLocal != null) {
Set<Connection> logs = requestLocal.getLocalVariable(
REQUEST_LOCAL_KEY, Set.class);
if (logs == null && createIfNotExist) {
logs = new HashSet<Connection>();
requestLocal.setLocalVariable(REQUEST_LOCAL_KEY, logs);
}
return logs;
}
return null;
}
public static void add(Connection conn) {
add(conn, RequestLocal.get());
}
public static void add(Connection conn, RequestLocal requestLocal) {
if (conn != null && requestLocal != null) {
Set<Connection> openConnections = getLogs(requestLocal, true);
openConnections.add(conn);
}
}
public static void remove(Connection conn) {
remove(conn, RequestLocal.get());
}
public static void remove(Connection conn, RequestLocal requestLocal) {
if (conn != null && requestLocal != null) {
Set<Connection> openConnections = getLogs(requestLocal, true);
openConnections.remove(conn);
}
}
public static void cleanUp() {
cleanUp(RequestLocal.get());
}
public static void cleanUp(RequestLocal requestLocal) {
if (requestLocal != null) {
Set<Connection> openConnections = getLogs(requestLocal, true);
if (openConnections.size() > 0) {
LOGGER.error("Bad, [" + openConnections.size()
+ "] leak JDBC connection(s)!");
for (Connection conn : openConnections) {
try {
conn.close();
} catch (Exception e) {
LOGGER.warn(e.getMessage(), e);
}
}
} else {
LOGGER.debug("Good, No leaked JDBC connection");
}
}
}
}