개발공부/spring boot
🚨ERROR - Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use:
기억지기 개발자
2024. 5. 24. 22:31
🏕️상황
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020-161]
H2 데이터베이스에 접속하려고 시도하는데 위와 같은 오류가 발생했다.
(오류 고칠 생각에 실제 화면은 캡처하지 못했다..)
원인은 크게 2가지이다.
- 동시 접근: 동일한 H2 데이터베이스에 여러 프로세스나 스레드에서 동시에 접근하려고 할 때 발생할 수 있다.
데이터베이스가 한 번에 하나의 프로세스나 스레드만 접근할 수 있도록 설계되어 있기 때문에 동시에 여러 개의 접속이 시도되면 이러한 오류가 발생할 수 있습니다. - 이전 연결이 제대로 종료되지 않음: 이전에 데이터베이스에 연결된 프로세스나 애플리케이션이 제대로 종료되지 않은 상태에서 데이터베이스가 잠긴 채로 남아 있을 때 발생할 수 있습니다. 이는 종료되지 않은 애플리케이션이 데이터베이스 파일에 대한 잠금을 유지하고 있어서 새로운 연결이 이루어지지 못하는 경우입니다.
나의 경우는 아마도 1번 이유때문인 거 같다.
💦과정
구글링을 통해서 다양한 방법으로 시도를 해봤는데 나의 경우에 맞는 해결 방법은 TCP 모드로 접속하는 것이었다.
포트 번호는 일반적으로 사용 가능한 범위 내에서 "선택"할 수 있다.
But!! 다른 서비스와 충돌하지 않도록 주의해야 한다. 대부분의 통신 프로토콜은 특정 포트 범위 내에서 작동하므로, 일반적으로 사용되지 않는 포트 내에서 선택하면 될 거 같다.
🗝️해결
연결에 성공~~!!
💟 궁금증 - h2 DB에서 embedded랑 server로 접속하는 것의 차이
💕임베디드(Embedded) 모드
- 임베디드 모드에서는 H2 데이터베이스가 애플리케이션과 함께 동작한다.
즉, 데이터베이스가 애플리케이션과 동일한 프로세스 내에서 실행된다. - 애플리케이션을 시작할 때 데이터베이스가 자동으로 시작되며, 애플리케이션 종료 시 데이터베이스도 함께 종료된다.
- 주로 개발 및 테스트 목적으로 사용된다. 애플리케이션이 소규모이고 단일 사용자만 접근하는 경우에 적합.
💕서버(Server) 모드
- 서버 모드에서는 H2 데이터베이스가 독립적인 프로세스로 실행된다.
- 여러 클라이언트가 동시에 데이터베이스에 접근할 수 있다. 따라서 서버 모드는 다중 사용자 환경에서 사용된다.
- 서버 모드는 데이터베이스가 애플리케이션과 분리되어 있기 때문에, 여러 애플리케이션이 동일한 데이터베이스에 접근할 수 있다.
또한, 데이터베이스 서버가 중앙 집중적으로 관리되기 때문에 보안 및 성능 관리가 용이.
