From 598fc2e31a10ea504628bbc74a24fb9ed98bfa24 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Tue, 30 Jul 2019 20:36:21 +0200
Subject: [PATCH] Add sql background runner to keep connection open

---
 pom.xml                                       |  5 ++++
 .../tobias/playpad/server/PlayPadServer.scala | 12 +++++++++-
 .../playpad/server/json/JsonSerializer.scala  |  1 -
 .../server/settings/SettingsSaver.scala       |  2 +-
 .../server/sql/SqlBackgroundRunner.scala      | 24 +++++++++++++++++++
 5 files changed, 41 insertions(+), 3 deletions(-)
 create mode 100644 src/main/scala/de/tobias/playpad/server/sql/SqlBackgroundRunner.scala

diff --git a/pom.xml b/pom.xml
index a961df3..c99a878 100644
--- a/pom.xml
+++ b/pom.xml
@@ -131,6 +131,11 @@
                         </goals>
                     </execution>
                 </executions>
+                <configuration>
+                    <args>
+                        <arg>-deprecation</arg>
+                    </args>
+                </configuration>
             </plugin>
 
             <plugin>
diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
index 32c3405..5436a00 100644
--- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
+++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
@@ -17,6 +17,7 @@ import de.tobias.playpad.server.server.plugin.{PluginGet, PluginList}
 import de.tobias.playpad.server.server.project._
 import de.tobias.playpad.server.server.project.sync.ProjectSyncHandler
 import de.tobias.playpad.server.settings.{Settings, SettingsHandler, SettingsLoader}
+import de.tobias.playpad.server.sql.SqlBackgroundRunner
 import de.tobias.playpad.server.transformer.JsonTransformer
 import spark.Spark._
 
@@ -30,8 +31,9 @@ object PlayPadServer extends App {
 	private var settings: Settings = _
 
 	private var databaseUrl: String = _
-	var connectionSource: JdbcConnectionSource = _
+	private var connectionSource: JdbcConnectionSource = _
 	private var databaseConnection: Connection = _
+	private var databaseBackgroundThread: Thread = _
 
 	try {
 		val app = ApplicationUtils.registerMainApplication(getClass)
@@ -71,6 +73,11 @@ object PlayPadServer extends App {
 		TableUtils.createTableIfNotExists(connectionSource, classOf[Session])
 		SqlHelper.createTables(databaseConnection)
 
+		val runner = new SqlBackgroundRunner(databaseConnection)
+		databaseBackgroundThread = new Thread(runner)
+		databaseBackgroundThread.start()
+
+
 		// Setup Http Server
 		port(8090)
 		threadPool(8, 2, 60 * 60 * 1000)
@@ -106,8 +113,11 @@ object PlayPadServer extends App {
 		SettingsHandler.saver.save(settings, settingsPath)
 
 		Runtime.getRuntime.addShutdownHook(new Thread(() => {
+			databaseBackgroundThread.interrupt()
+
 			databaseConnection.close()
 			connectionSource.close()
+
 			stop()
 		}))
 	} catch {
diff --git a/src/main/scala/de/tobias/playpad/server/json/JsonSerializer.scala b/src/main/scala/de/tobias/playpad/server/json/JsonSerializer.scala
index 5683dde..13a3e9d 100644
--- a/src/main/scala/de/tobias/playpad/server/json/JsonSerializer.scala
+++ b/src/main/scala/de/tobias/playpad/server/json/JsonSerializer.scala
@@ -54,7 +54,6 @@ class JsonSerializer {
 		clazz.getDeclaredFields
 			.filter(f => f.isAnnotationPresent(classOf[JsonName]))
 			.foreach(f => {
-				println(clazz + "\t" + f.getName)
 				f.setAccessible(true)
 				val annotation = f.getAnnotation(classOf[JsonName])
 				val value = jsonObject.get(annotation.value())
diff --git a/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala b/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala
index 27d37c3..d631702 100644
--- a/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala
+++ b/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala
@@ -9,7 +9,7 @@ import java.nio.file.Path
 trait SettingsSaver {
 
 	@throws[IOException]
-	def save(settings: Settings, path: Path)
+	def save(settings: Settings, path: Path): Unit
 
 	def default(path: Path): Unit = save(new Settings(), path)
 }
diff --git a/src/main/scala/de/tobias/playpad/server/sql/SqlBackgroundRunner.scala b/src/main/scala/de/tobias/playpad/server/sql/SqlBackgroundRunner.scala
new file mode 100644
index 0000000..0e5c75f
--- /dev/null
+++ b/src/main/scala/de/tobias/playpad/server/sql/SqlBackgroundRunner.scala
@@ -0,0 +1,24 @@
+package de.tobias.playpad.server.sql
+
+import java.sql.Connection
+
+class SqlBackgroundRunner(connection: Connection) extends Runnable {
+
+	private val SLEEP = 5 * 60 * 1000
+
+	override def run(): Unit = {
+		while (!Thread.interrupted()) {
+			val statement = connection.prepareStatement("SHOW TABLES;")
+			val resultSet = statement.executeQuery()
+
+			resultSet.close()
+			statement.close()
+
+			try {
+				Thread.sleep(SLEEP)
+			} catch {
+				case _: InterruptedException => return
+			}
+		}
+	}
+}
-- 
GitLab