Следуя примеру, представленному в Exposed, я не могу прочитать созданные таблицы / данные за пределами созданной транзакции. Я использую базу данных h2-in-memory.
Исключение составляет:
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement:
Я добавил вызов для фиксации, но это не помогает. Если я прочитаю данные в транзакции, создающей данные, как в примере по ссылке на github, она работает нормально. Вот упрощенная версия:
fun main(args: Array<String>) { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { create(Cities) City.new { name = "St. Petersburg" } println("Cities: ${City.all().joinToString { it.name }}") //I have added this commit here commit() } //I want to read the data outside the transaction, but it does not work transaction { println("Cities: ${City.all().joinToString { it.name }}") } }
Как я могу сохранить данные?
Добавление logger.addLogger(StdOutSqlLogger)
дает следующий результат:
SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(50) NOT NULL) SQL: INSERT INTO CITIES (NAME) VALUES ('St. Petersburg') SQL: SELECT CITIES.ID, CITIES.NAME FROM CITIES
Он совершает транзакцию. Проблема в том, что когда база данных в памяти закрыта, она удаляется и база данных в памяти закрывается при следующих обстоятельствах:
По умолчанию H2 закрывает базу данных, когда последнее соединение закрыто
Источник
Вот диаграмма, поэтому легче понять, что происходит шаг за шагом (когда база данных закрыта, она полностью удалена)
Самое простое решение – просто использовать фактическую файловую базу данных вместо памяти.
Изменение базы данных из памяти в Database.connect("jdbc:h2:~/test", driver = "org.h2.Driver")
проблему.
Похоже, вы отошли от памяти H2, чтобы решить вашу проблему. Имейте в виду, что корень вашей первоначальной проблемы, вероятно, был вызван тем, что H2 нужно поддерживать ваши таблицы для жизни JVM:
JDBC: h2: MEM: тест; DB_CLOSE_DELAY = -1
далее поясняется здесь: H2 in-memory database. Таблица не найдена