0
votes

I'm using HSQLDB embedded in-memory in a Play for Scala application server.

I configure the driver like so:

   driver = org.hsqldb.jdbc.JDBCDriver
   url = "jdbc:hsqldb:mem:inmemory"

Also, when Play restarts I issue a SHUTDOWN statement in the HSQLDB connection.

This seems to work fine, however when I restart Play around 20 times in the development environment I get the following out of memory exception. Is HDBSQL shut down correctly? Maybe the database is closed but the engine memory itself is not released?

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Metaspace at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) Caused by: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at scala.collection.Iterator$class.toStream(Iterator.scala:1181) at scala.collection.AbstractIterator.toStream(Iterator.scala:1194) at scala.collection.TraversableOnce$class.toSeq(TraversableOnce.scala:296) at scala.collection.AbstractIterator.toSeq(Iterator.scala:1194) at scala.tools.nsc.backend.jvm.GenASM$newNormal$.computeDetour$1(GenASM.scala:3094) at scala.tools.nsc.backend.jvm.GenASM$newNormal$.collapseJumpOnlyBlocks(GenASM.scala:3126) at scala.tools.nsc.backend.jvm.GenASM$newNormal$.normalize(GenASM.scala:3195) at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genCode(GenASM.scala:1861) at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genMethod(GenASM.scala:1467) at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genClass(GenASM.scala:1337)

1

1 Answers

0
votes

HSQLDB has a way to automatically shutdown the database when the last connection is closed. You need to add shutdown=true as a URL property:

url = "jdbc:hsqldb:mem:inmemory;shutdown=true"

See more details in the docs:

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#N15641