我在设置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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top