2017-08-05 117 views
1

根据Exposed上提供的示例,我无法读取创建它的事务外部创建的表/数据。我正在使用h2-in-memory数据库。Kotlin Exposed未提交交易

唯一的例外是:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement: 

我添加了一个调用commit,但是这并不能帮助。如果我在创建数据的事务中读取数据,如链接到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 
+0

例外basicaly说你没有数据库中的CITIES表。你确定你的h2数据库为你创建了它吗? – pokemzok

+0

是的,第一次在创建表格和行的事务内读取并打印出城市:圣彼得堡。表和行已正确创建,但因某些原因在关闭第一个事务后无法访问。 – rustyfinger

+0

我看这里http://www.h2database.com/html/faq.html一些答案。有趣的部分是标题为“数据库文件存储在哪里?”的部分。你能在电脑上找到这些文件吗? – pokemzok

回答

1

在内存中Database.connect("jdbc:h2:~/test", driver = "org.h2.Driver")更改DB固定的问题。

1

它确实提交交易。问题是,时关闭内存数据库那么它删除,并在内存数据库在下列情况下关闭:

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

Source

这里有一个图,以便更容易理解发生了什么一步一步(当数据库被关闭它完全删除)

diagram

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

+0

很高兴知道,感谢分享。基于文件对我来说工作得很好。 – rustyfinger

1

看起来你已经从内存H2中移开来解决你的问题了。注意,您的初始问题的根源可能是因为H2需要被告知要保持你的表为JVM的生活:

的jdbc:H2:MEM:测试; DB_CLOSE_DELAY = -1

这里进一步解释:H2 in-memory database. Table not found