【问题标题】:Kotlin Exposed does not commit transactionKotlin Exposed 不提交事务
【发布时间】:2018-01-13 05:22:52
【问题描述】:

按照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

【问题讨论】:

  • 该异常基本上是说您在数据库中没有表 CITIES。你确定是 h2 数据库为你创建的吗?
  • 是的,在创建表和行的事务中的第一次读取工作正常并打印出 Cities: St. Petersburg。表和行已正确创建,但由于某种原因在关闭第一个事务后无法访问。
  • 我在这里查看h2database.com/html/faq.html 以获得一些答案。对您来说有趣的部分是标题为“数据库文件存储在哪里?”的部分。你能在你的电脑上找到这些文件吗?
  • 我将它用作内存数据库:jdbc:h2:mem:test

标签: transactions kotlin kotlin-exposed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    Source

    这是一个图表,因此更容易理解一步一步发生的事情(当数据库关闭时,它会被完全删除)

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

    【讨论】:

    • 很高兴知道,感谢分享。基于文件的文件对我来说效果很好。
    【解决方案3】:

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

    jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

    在此进一步解释:H2 in-memory database. Table not found

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2011-04-30
      相关资源
      最近更新 更多