Transactions Kotlin Exposed不提交事务

Transactions Kotlin Exposed不提交事务,transactions,kotlin,kotlin-exposed,Transactions,Kotlin,Kotlin Exposed,按照上提供的示例,我无法读取创建它的事务之外创建的表/数据。我正在使用h2内存数据库 例外情况是: Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement: 我添加了一个提交调用,但这没有帮助。如果我在创建数据的事务中读取数据,如github链接上的示例所示,它工作正常。以下是它的简化版本: fun main(args: Array<String>

按照上提供的示例,我无法读取创建它的事务之外创建的表/数据。我正在使用h2内存数据库

例外情况是:

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 }}")

    }
}

将数据库从内存中更改为
数据库.connect(“jdbc:h2:~/test”,driver=“org.h2.driver”)
解决了这个问题。

它确实提交了事务。问题是,当关闭内存中数据库时,它将被删除,并且在以下情况下关闭内存中数据库:

默认情况下,H2在最后一个连接关闭时关闭数据库

下面是一个图表,以便更容易理解一步一步发生的情况(当数据库关闭时,它将被完全删除)


最简单的解决方案是简单地使用实际的文件数据库,而不是内存中的数据库。

看起来您已经从内存中的H2移开来解决问题。请注意,最初问题的根源可能是因为需要告知H2在JVM的生命周期内保留表:

jdbc:h2:mem:test;DB_关闭_延迟=-1


这里进一步解释:

例外情况基本上是说数据库中没有一个表CITIES。您确定是h2数据库为您创建的吗?是的,事务中创建表和行的第一次读取工作正常,并打印出城市:圣彼得堡。表和行创建正确,但由于某些原因,在关闭第一个事务后无法访问。我在这里查找一些答案。您感兴趣的部分是标题为“数据库文件存储在哪里?”。你能在你的计算机上找到这些文件吗?我正在使用它作为内存DB:jdbc:h2:mem:Test很高兴知道,谢谢分享。基于文件的方法对我来说一直很有效。
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