Comment configurer Slick pour conserver les tables entre les sessions ?
Question
J'ai rencontré quelques problèmes lors de la configuration de Slick 2.0.2.Toute configuration que je fais au cours d'une session est perdue lors de la suivante.Par exemple, lors de la première session, je crée le tableau et j'ajoute trois personnes :
// 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)
}
}
Tout va bien jusqu’à présent.La sortie répète les trois personnes que j'ai ajoutées.Lorsque je démarre une nouvelle session, je commence à rencontrer des problèmes.
// New session in which the previous data is lost
db withSession { implicit session =>
contacts foreach { person =>
println(person)
}
}
Le bloc ci-dessus crée un org.h2.jdbc.JdbcSQLException: Table "CONTACTS" not found
exception.Si je modifie comme suit
db withSession { implicit session =>
contacts.ddl.create
contacts foreach { person =>
println(person)
}
}
alors toutes les données sont effacées.
Je vois que le Guide Scalatra pour Slick utilise une configuration similaire à la mienne.Qu'est-ce que je fais mal?Comment dois-je faire en sorte que les données persistent entre les sessions ?Le fait que j'utilise une base de données en mémoire a-t-il quelque chose à voir avec cela ?
La solution
Deux choix.
Soit créez une session et gardez-la ouverte.Cela peut être fait avec une portée withSession inférieure sur la pile d'appels ou db.createSession.
Ou ajouter ;DB_CLOSE_DELAY=-1
à l'URL de la base de données.Cela maintient la base de données en vie tant que la machine virtuelle s'exécute.
Voir http://www.h2database.com/html/features.html#in_memory_databases