Commit 6b95778b authored by Luna Riegel's avatar Luna Riegel
Browse files

Feat: Add connection pooling to DatabaseHandler

parent 58a625c9
package de.hft.stuttgart.citydoctor2.database; package de.hft.stuttgart.citydoctor2.database;
import com.zaxxer.hikari.HikariDataSource;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor; import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox; import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import javafx.scene.control.Alert;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.SerializationException; import org.apache.commons.lang3.SerializationException;
import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.SerializationUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
...@@ -15,7 +16,6 @@ import org.h2gis.functions.factory.H2GISDBFactory; ...@@ -15,7 +16,6 @@ import org.h2gis.functions.factory.H2GISDBFactory;
import org.h2gis.utilities.wrapper.ConnectionWrapper; import org.h2gis.utilities.wrapper.ConnectionWrapper;
import org.h2gis.utilities.wrapper.DataSourceWrapper; import org.h2gis.utilities.wrapper.DataSourceWrapper;
import javax.sql.DataSource;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
...@@ -27,20 +27,29 @@ import java.util.ArrayList; ...@@ -27,20 +27,29 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class DatabaseHandler { public class DatabaseHandler {
private static final Logger logger = LogManager.getLogger(DatabaseHandler.class); private static final Logger logger = LogManager.getLogger(DatabaseHandler.class);
private static final String DB_NAME = "/database/cd_db"; private static final String DB_NAME = "/database/cd_db";
private DataSourceWrapper dataSource; private DataSourceWrapper dataSource;
//TODO: Connection pooling
public DatabaseHandler(){ public DatabaseHandler(){
try { try {
// Cleanup hook Runtime.getRuntime().addShutdownHook(new Thread(() -> {})); // Cleanup hook Runtime.getRuntime().addShutdownHook(new Thread(() -> {}));
dataSource = new DataSourceWrapper(H2GISDBFactory.createDataSource(DB_NAME, String jdbcurl = H2GISDBFactory.createDataSource(DB_NAME,
true, ";AUTO_SERVER=TRUE;MV_STORE=TRUE;CACHE_SIZE=65536;LOCK_TIMEOUT=10000")); true, ";AUTO_SERVER=TRUE").getConnection().getMetaData().getURL();
HikariDataSource ds = new HikariDataSource();
setupFeaturesTable(); setupFeaturesTable();
ds.setJdbcUrl(jdbcurl);
ds.setUsername("sa");
ds.setPassword("sa");
int coreCount = Runtime.getRuntime().availableProcessors();
ds.setMaximumPoolSize(coreCount*5);
ds.setMinimumIdle(coreCount*5);
dataSource = new DataSourceWrapper(ds);
} catch (Exception e) { } catch (Exception e) {
logger.fatal("FATAL ERROR: Creation of embedded database failed!"); logger.fatal("FATAL ERROR: Creation of embedded database failed!");
logger.fatal(e.getMessage()); logger.fatal(e.getMessage());
...@@ -78,7 +87,7 @@ public class DatabaseHandler { ...@@ -78,7 +87,7 @@ public class DatabaseHandler {
* @param co the CityObject * @param co the CityObject
*/ */
public void marshallCityObject(CityObject co) { public void marshallCityObject(CityObject co) {
try (Connection con = H2GISDBFactory.openSpatialDataBase(DB_NAME)) { try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) { try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) {
ps.setString(1, co.getGmlId().toString()); ps.setString(1, co.getGmlId().toString());
String bbox = BoundingBox.of(co).to2DWkt(); String bbox = BoundingBox.of(co).to2DWkt();
...@@ -106,7 +115,7 @@ public class DatabaseHandler { ...@@ -106,7 +115,7 @@ public class DatabaseHandler {
public boolean tryMarshallCityObjectMap(Map<GmlId, CityObject> map) { public boolean tryMarshallCityObjectMap(Map<GmlId, CityObject> map) {
// Id String for error logging // Id String for error logging
String id = ""; String id = "";
try (Connection con = H2GISDBFactory.openSpatialDataBase(DB_NAME)) { try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) { try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) {
con.setAutoCommit(false); con.setAutoCommit(false);
for (Map.Entry<GmlId, CityObject> entry : map.entrySet()) { for (Map.Entry<GmlId, CityObject> entry : map.entrySet()) {
...@@ -150,7 +159,7 @@ public class DatabaseHandler { ...@@ -150,7 +159,7 @@ public class DatabaseHandler {
* @return the Feature, or null if no entry was found * @return the Feature, or null if no entry was found
*/ */
public CityObject unmarshallCityObject(GmlId id) { public CityObject unmarshallCityObject(GmlId id) {
try (Connection con = H2GISDBFactory.openSpatialDataBase(DB_NAME)) { try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement( try (PreparedStatement ps = con.prepareStatement(
"SELECT gmlid, bbox, data FROM features WHERE gmlid = ?")) { "SELECT gmlid, bbox, data FROM features WHERE gmlid = ?")) {
ps.setString(1, id.toString()); ps.setString(1, id.toString());
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment