如何配置Slick以在会话之间持久化表?
题
我在设置Slick2.0.2时遇到了一些问题。我在一个会话中执行的任何配置都会在下一个会话中丢失。例如,在第一个会话中,我创建表格并添加三个人:
// H2 in-memory database
lazy val db = Database.forURL("jdbc:h2:mem:contacts", driver="org.h2.Driver")
// Contacts table
lazy val contacts = TableQuery[ContactsSchema]
// Initial session
db withSession { implicit session =>
contacts.ddl.create
// Inserts sample data
contacts += Person("John", "123 Main street", 29)
contacts += Person("Greg", "Neither here nor there", 40)
contacts += Person("Michael", "Continental U.S.", 34)
// Successfully retrieves data
contacts foreach { person =>
println(person)
}
}
一切都很好到这一点。输出重复我添加的三个人。当我开始一个新的会话时,我开始遇到问题。
// New session in which the previous data is lost
db withSession { implicit session =>
contacts foreach { person =>
println(person)
}
}
上面的块创建了一个 org.h2.jdbc.JdbcSQLException: Table "CONTACTS" not found
例外。如果我编辑如下
db withSession { implicit session =>
contacts.ddl.create
contacts foreach { person =>
println(person)
}
}
然后所有的数据被擦除。
我看到 斯卡拉特拉指南 使用与我的类似的配置。我做错了什么?我应该如何让数据在会话之间持久化?我使用内存数据库的事实是否与此有关?
解决方案
两个选择。
要么创建一个会话并保持打开状态。这可以在调用堆栈或db上使用更低的withSession范围来完成。创建分离。
或添加 ;DB_CLOSE_DELAY=-1
到数据库url。只要vm运行,这就会使数据库保持活动状态。
见 http://www.h2database.com/html/features.html#in_memory_databases
不隶属于 StackOverflow