【发布时间】:2014-06-12 15:09:18
【问题描述】:
我试图弄清楚当前打开了多少个连接,但我似乎找不到使用 Hikari 的明显方法。
HikariPool 公开了该信息 (getActiveConnections),但我没有看到从 HikariDataSource 访问该信息的简单方法。
【问题讨论】:
标签: hikaricp
我试图弄清楚当前打开了多少个连接,但我似乎找不到使用 Hikari 的明显方法。
HikariPool 公开了该信息 (getActiveConnections),但我没有看到从 HikariDataSource 访问该信息的简单方法。
【问题讨论】:
标签: hikaricp
如果你使用的是弹簧靴:
new HikariDataSourcePoolMetadata(dataSource).getActive();
【讨论】:
您必须通过 JMX 编程访问来获取它。首先,通过registerMbeans 属性或调用setRegisterMeans() 启用MBean 注册。然后参考此页面了解如何执行编程访问:
https://github.com/brettwooldridge/HikariCP/wiki/JMX-Monitoring
【讨论】:
HikariDataSource。如果这很“简单”,您不能使用 API 访问这些信息吗?我不能也不会为此使用 JMX。谢谢。
您可以使用以下类进行更好的监控:
import javax.sql.DataSource;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.pool.HikariPool;
import lombok.extern.slf4j.Slf4j;
@Aspect
@Component
@Slf4j
public class DataSourceAspectLogger {
private HikariPool pool;
@Autowired
private HikariDataSource ds;
@Before("execution(* com.x.common.sql.repo.*.*(..))")
public void logBeforeConnection(JoinPoint jp) throws Throwable {
logDataSourceInfos("Before", jp);
}
@After("execution(* com.x.common.sql.repo.*.*(..)) ")
public void logAfterConnection(JoinPoint jp) throws Throwable {
logDataSourceInfos("After", jp);
}
@Autowired
public void getPool() {
try {
java.lang.reflect.Field field = ds.getClass().getDeclaredField("pool");
field.setAccessible(true);
this.pool = (HikariPool) field.get(ds);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void logDataSourceInfos(final String time, final JoinPoint jp) {
final String method = String.format("%s:%s", jp.getTarget().getClass().getName(), jp.getSignature().getName());
int totalConnections = pool.getTotalConnections();
int activeConnections = pool.getActiveConnections();
int freeConnections = totalConnections - activeConnections;
int connectionWaiting = pool.getThreadsAwaitingConnection();
log.info(String.format("%s %s: number of connections in use by the application (active): %d.", time, method, activeConnections));
log.info(String.format("%s %s: the number of established but idle connections: %d.", time, method, freeConnections));
log.info(String.format("%s %s: number of threads waiting for a connection: %d.", time, method, connectionWaiting));
log.info(String.format("%s %s: max pool size: %d.", time, method, ds.getMaximumPoolSize()));
}
}
【讨论】:
这可以非常直接地完成。
dataSource.hikariPoolMXBean.activeConnections
【讨论】: