[참고] H2 DB documentation
DB URL OverviewEmbedded (local) connectionIn-Memory DatabaseCompatability ModesExecute SQL on ConnectionTroubleShootingschema.sql 에서 생기는 에러table already exists에러
DB URL Overview
Embedded (local) connection
jdbc:h2:[file:][<path>]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample
- local file system에 해당 db 파일이 생성됨
In-Memory Database
- rapid prototyping, testing, high performance operations, read-only databases에 대해서 데이터를 영속화 시킬 필요가 없을 때가 있음. 이때 in-memory 모드로 사용함
jdbc:h2:mem
으로 사용하면 database가 private하게 열린다는 의미 → 오직 하나의 connection만 가능함
- 하나의 in-memory db에 여러 커넥션을 이용하려면 database URL이 이름을 포함해야함
jdbc:h2:mem:db1
와 같이- Jdbc 이용시에는 이렇게 명시하기.
jdbc:h2:mem
의 형태로 작성 시, connection metadata 접근이 불가능함. 잘안됨
- in-memory db를 다른 프로세스나 다른 컴퓨터에서 접속하고 싶을 때는 TCP Server로 띄워야 함.
jdbc:h2:tcp://localhost/mem:db1
- 디폴트로 마지막 connection을 끊게 되면 database가 꺼지게 되고 content가 다 날아가게 됨. database를 open한 상태로 유지하려면
;DB_CLOSE_DELAY=-1
을 URL에 명시해주어야함 →VM이 살아있는 동안은 메모리 db 유지됨 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
- H2는 대문자로 이름을 가진 테이블을 만든 다음 스크립트에서 소문자를 사용하더라도 대소문자를 구분하기에 이를 구분하지 않게 해주려면 아래와 같이 작성
jdbc:h2:mem:test;DATABASE_TO_UPPER=false
- In-Memory로 쓸거면 이렇게 쓰는게 제일 편할듯
jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1
Compatability Modes
- 특정한 기능들에 대해 h2는 다른 db를 모방할 수 있음
jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
Execute SQL on Connection
- DDL과 DML을 클라이언트가 db에 연결할 때 자동으로 실행해주도록 하는 기능임
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:/schema.sql';DB_CLOSE_DELAY=-1
TroubleShooting
schema.sql 에서 생기는 에러

- sql syntax error가 자꾸 생겼었는데, 아래 schema.sql 과 같이 DROP 부분을 붙여주니 해결이 됐었음. 원인을 잘 모르겠음;
DROP TABLE IF EXISTS product; CREATE TABLE product( id BINARY(16) NOT NULL PRIMARY KEY, name varchar(20) NOT NULL, category varchar(50) NOT NULL, price bigint NOT NULL, description varchar(500) DEFAULT NULL, created_at datetime(6) NOT NULL, updated_at datetime(6) DEFAULT NULL );
table already exists에러
spring: h2: console: enabled: true datasource: url: jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:/schema.sql'; username: sa hikari: maximum-pool-size: 1 minimum-idle: 1 jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect
- url부분에 INIT으로 runscript를 명시해주면, h2가 시작될 때 바로 저 schema.sql이 실행되는 듯함
- 그러고 나서 spring에서 자동으로 실행시키는 schema.sql을 실행시키면, Table이 이미 있다고 하면서 에러가 발생함 → schema.sql이 두번 실행되는 것