Схема H2 исчезает после закрытия соединения - PullRequest
0 голосов
/ 18 апреля 2020

после настройки схемы в базе данных H2 для модульного тестирования, модульные тесты, основанные на схеме, не смогли ее найти.

import java.sql.DriverManager
Class.forName("org.h2.Driver")

val setupConn = DriverManager.getConnection("jdbc:h2:mem:test_data_metrics;MODE=PostgreSQL", "sa", "")
val setupStmt = setupConn.createStatement

// setup schema at the beginning of our test
setupStmt.execute("CREATE SCHEMA IF NOT EXISTS my_test_schema AUTHORIZATION sa;")
setupStmt.execute("GRANT ALL ON SCHEMA my_test_schema TO sa;")
setupStmt.execute("CREATE TABLE IF NOT EXISTS my_test_schema.my_test_table (test_id VARCHAR(255), test_column VARCHAR(255));")
setupStmt.executeQuery("select * from my_test_schema.my_test_table")
// res4: java.sql.ResultSet = rs3: org.h2.result.LocalResultImpl@3eb10d62 columns: 2 rows: 0 pos: -1
// this seems to work correctly ^^^

setupStmt.close
setupConn.close

// now run our test using the schema we just set up
val conn = DriverManager.getConnection("jdbc:h2:mem:test_data_metrics;SCHEMA=my_test_schema;MODE=PostgreSQL", "sa", "")
val stmt = conn.createStatement

stmt.executeQuery("select * from my_test_table where test_id = '1'")
// org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "MY_TEST_SCHEMA" not found; SQL statement:
// SET SCHEMA my_test_schema [90079-200]
// ^^^^ something has gone horribly wrong

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Вы можете просто добавить ;DB_CLOSE_DELAY=-1 к URL JDB C; нет необходимости иметь активное соединение. https://h2database.com/html/commands.html#set_db_close_delay

Если вы используете какую-то недавнюю версию H2, вы также можете добавить ;DATABASE_TO_LOWER=TRUE для лучшей совместимости с PostgreSQL; режим совместимости PostgreSQL сам по себе не подразумевает эту настройку.

0 голосов
/ 18 апреля 2020

Это смущает, но я не осознавал, что, когда я закрывал соединение с моей базой данных в памяти, база данных dry взлетала бы и сдувалась. Это кажется очевидным в ретроспективе. Решение состоит в том, чтобы сохранить первое соединение с базой данных открытым во время тестирования.

import java.sql.DriverManager

Class.forName("org.h2.Driver")

val setupConn = DriverManager.getConnection("jdbc:h2:mem:test_data_metrics;MODE=PostgreSQL", "sa", "")
val setupStmt = setupConn.createStatement

// setup schema at the beginning of our test
setupStmt.execute("CREATE SCHEMA IF NOT EXISTS my_test_schema AUTHORIZATION sa;")
setupStmt.execute("GRANT ALL ON SCHEMA my_test_schema TO sa;")
setupStmt.execute("CREATE TABLE IF NOT EXISTS my_test_schema.my_test_table (test_id VARCHAR(255), test_column VARCHAR(255));")
setupStmt.executeQuery("select * from my_test_schema.my_test_table")
// res4: java.sql.ResultSet = rs3: org.h2.result.LocalResultImpl@3eb10d62 columns: 2 rows: 0 pos: -1

// DON'T CLOSE THE CONNECTION YET!
//setupStmt.close 
//setupConn.close

val conn = DriverManager.getConnection("jdbc:h2:mem:test_data_metrics;SCHEMA=my_test_schema;MODE=PostgreSQL", "sa", "")
val stmt = conn.createStatement

stmt.executeQuery("select * from my_test_table where test_id = '1'")
// res5: java.sql.ResultSet = rs4: org.h2.result.LocalResultImpl@293e66e4 columns: 2 rows: 0 pos: -1
// ^^^^ huzzah!
...