package org.dayatang.dsmonitor.monitor; import org.apache.commons.lang3.time.DateFormatUtils; import org.dayatang.dsmonitor.ConnectionMonitor; import org.dayatang.dsmonitor.GeminiConnection; import org.dayatang.utils.Slf4JLogger; import java.sql.SQLException; import java.util.Collections; import java.util.HashSet; import java.util.Set; public abstract class AbstractGeminiConnectionTimeoutMonitor implements ConnectionMonitor { private final Slf4JLogger LOGGER = Slf4JLogger.getLogger(AbstractGeminiConnectionTimeoutMonitor.class); private static String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss"; private Set<GeminiConnection> aliveConnections = Collections.synchronizedSet(new HashSet<GeminiConnection>()); private int connectionCount; /** * 单位:毫秒,默认10000毫秒,即10s */ private long timeout = 1000; public void openConnection(GeminiConnection connection) throws SQLException { LOGGER.debug("开启数据库连接HashCode【{}】,URL=【{}】,创建时间【{}】", connection.hashCode(), connection.getMetaData().getURL(), formatTime(connection.getCreationTime())); aliveConnections.add(connection); connectionCount++; } public void closeConnection(GeminiConnection connection) throws SQLException { LOGGER.debug("关闭数据库连接HashCode【{}】,创建时间【{}】,耗时【{}】ms", connection.hashCode(), formatTime(connection.getCreationTime()), connection.getSurvivalTime()); aliveConnections.remove(connection); } private boolean isTimeout(GeminiConnection connection) { return connection.getSurvivalTime() > timeout; } /** * 单位:毫秒,默认10000毫秒,即10s * * @return 超时时间 */ public long getTimeout() { return timeout; } /** * 设置超时时间,以毫秒为单位 * * @param timeout 超时时间 */ public void setTimeout(long timeout) { this.timeout = timeout; } /** * 获取活动的超时连接集合 * * @return 活动的超时连接集合 */ public Set<GeminiConnection> getAliveTimeoutConnections() { Set<GeminiConnection> results = new HashSet<GeminiConnection>(); for (GeminiConnection conn : aliveConnections) { if (isTimeout(conn)) { results.add(conn); } } return results; } /** * 获取活动的连接集合 * * @return 活动的连接集合 */ public Set<GeminiConnection> getAliveConnections() { return Collections.unmodifiableSet(aliveConnections); } public int getConnectionCount() { return connectionCount; } private String formatTime(long date) { return DateFormatUtils.format(date, DATE_PATTERN); } }