본문 바로가기
Category/Spring

스프링 스케줄러를 사용하여 커넥션풀의 현재 커넥션 개수 측정하기

by developer__Y 2024. 10. 16.

 

spring을 통해 실행중인 어플리케이션에서 현재 커넥션풀의 연결된 커넥션 개수와 유휴 커넥션 개수등을 모니터링하는 방법에 대해 알아보았다.

커넥션풀은 commons의 dbcp 라이브러리를 사용하고있고, 스프링 빈에 정의된 datasource을 통해

커넥션풀의 maxIdle, maxActive등을 설정한다.

여기서 스프링 빈에 정의된 datasource 객체는 BasicDataSource이다.

commons의 dbcp 공식문서에서 BasicDataSource 클래스에 대해 살펴보면,

 

 

getNumActive() 와 getNumIdle() 메소드가 있다.

해당 메소드는 현재 연결중인 데이터소스(커넥션) 갯수와 유휴 커넥션 갯수를 반환한다.

 

따라서, DataSource는 이미 스프링빈에 정의되어있으므로 해당 데이터소스를 주입받아

두 메소드를 통해 현재 실행중인 커넥션 갯수를 로그로 남기는 클래스를 하나 만들어준다.

 

@Component
public class ConnectionPoolMonitor {
	
	 private static final Logger logger = LoggerFactory.getLogger(ConnectionPoolMonitor.class);
	 
	@Autowired
	@Qualifier("dataSource-dbname")
	private BasicDataSource dataSource;
	
	   public void logConnectionStats() {
	        int activeConnections = dataSource.getNumActive();
	        int idleConnections = dataSource.getNumIdle();
	        logger.debug("현재 활성화된 연결 : " + activeConnections);
	        logger.debug("유휴 연결 : " + idleConnections);
	    }
}

 

 

위 ConnectionPoolMonitor 클래스에서 스프링빈에서 dataSource를 주입받아 커넥션 개수를 로그로 남기는 메소드를 작성했다. 

그리고 해당 클래스또한 @Component를 통해 빈에 등록시켜주었다.

 

이제, Spring 어플리케이션이 실행되는 중에 일정 시간마다 logConnectionStats() 메소드를 실행시켜주기만 하면 된다.

 

스프링 스케줄러

 

어플리케이션이 실행되고 있는 중에 일정한 시간 간격마다 원하는 작업을 처리해주기위해 Spring 프레임워크에서 

제공하는 scheduler을 사용해보았다.

 

spring scheduler은 추가적인 의존성 필요없이 스프링 프레임워크에서 제공하므로 어노테이션을 통해 사용할수있다.

우선, 스케줄러를 사용하기위해 xml 설정파일에서 bean에 필요한 xmlns와 스키마를 추가해준다.

 

<beans
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">

// 스케줄링 설정(어노테이션)
<task:annotation-driven />

 

 

스케줄러를 통해 실행할 작업들은 @Scheduled 어노테이션을 통해 간단하게 설정할수있다.

그리고 유의해야할 점은 스케줄러에 설정된 작업을 하는 클래스 또한 Bean에 등록되어있어야한다.

따라서 스케줄링을 하는 클래스를 하나 생성해준다.

 

@Component
public class ConnectionPoolScheduler {
	
	@Autowired
	private ConnectionPoolMonitor monitor;
	
	@Scheduled(fixedRate = 3000)
	public void logConnectionStats(){
		monitor.logConnectionStats();
	}
}

 

fixedRate = 3000 을 통해 3초에 1번씩 실행해주도록 하였다.

이후 tomcat을 실행시켜 로그를 확인해보면 3초에 1번씩 해당 작업이 실행되는것을 알수있다!