¿Cómo se debe configurar Slick para conservar tablas entre sesiones?
Pregunta
He experimentado algunos problemas al configurar Slick 2.0.2.Cualquier configuración que haga en una sesión se pierde en la siguiente.Por ejemplo, en la primera sesión creo la tabla y agrego tres personas:
// 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)
}
}
Todo va bien hasta este momento.El resultado repite las tres personas que agregué.Cuando comienzo una nueva sesión, empiezo a experimentar problemas.
// New session in which the previous data is lost
db withSession { implicit session =>
contacts foreach { person =>
println(person)
}
}
El bloque anterior crea un org.h2.jdbc.JdbcSQLException: Table "CONTACTS" not found
excepción.Si edito de la siguiente manera
db withSession { implicit session =>
contacts.ddl.create
contacts foreach { person =>
println(person)
}
}
luego se borran todos los datos.
veo que el Guía Scalatra para Slick utiliza una configuración similar a la mía.¿Qué estoy haciendo mal?¿Cómo debo hacer que los datos persistan entre sesiones?¿Tiene algo que ver el hecho de que esté usando una base de datos en memoria?
Solución
Dos opciones.
O cree una sesión y manténgala abierta.Eso se puede hacer con un alcance withSession más bajo en la pila de llamadas o db.createSession.
O agregar ;DB_CLOSE_DELAY=-1
a la URL de la base de datos.Eso mantiene viva la base de datos mientras se ejecuta la máquina virtual.
Ver http://www.h2database.com/html/features.html#in_memory_databases