Transactions Kotlin Exposed不提交事务
按照上提供的示例,我无法读取创建它的事务之外创建的表/数据。我正在使用h2内存数据库 例外情况是: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>
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