Repository: iluwatar/java-design-patterns
Issue: Uniform handling for H2 databases
Labels: epic: architecture
type: refactoring
status: stale

At the moment, many of the patterns utilize H2 databases to demonstrate data access (search for `jdbc:h2`). The problem is that we don't have a unified approach. Some of the patterns use file-based database written somewhere under the home directory and some use in-memory databases. Perhaps we could use in-memory databases everywhere so the user's disk would not be cluttered? If not possible, at least store the database files under the same directory.

Acceptance criteria

- H2 database handling is unified


Issue comments:
@iluwatar Can I work on this issue?

I would like to work on this issue, can I join?
This issue has been automatically marked as stale because it has not had recent activity. The issue will be unassigned if no further activity occurs. Thank you for your contributions.

Hello, I don't see any PR related to this problem. 
I still see both h2 db versions in the code, please assign this to me.
This issue has been automatically marked as stale because it has not had recent activity. The issue will be unassigned if no further activity occurs. Thank you for your contributions.


Pull request review comments:

Patch that resolved the issue:
diff --git a/dao/src/main/java/com/iluwatar/dao/App.java b/dao/src/main/java/com/iluwatar/dao/App.java
index 20d1db0633dd..f0d19749c64b 100644
--- a/dao/src/main/java/com/iluwatar/dao/App.java
+++ b/dao/src/main/java/com/iluwatar/dao/App.java
@@ -44,7 +44,7 @@
  */
 @Slf4j
 public class App {
-  private static final String DB_URL = "jdbc:h2:~/dao";
+  private static final String DB_URL = "jdbc:h2:mem:dao;DB_CLOSE_DELAY=-1";
   private static final String ALL_CUSTOMERS = "customerDao.getAllCustomers(): ";
 
   /**
diff --git a/domain-model/src/main/java/com/iluwatar/domainmodel/App.java b/domain-model/src/main/java/com/iluwatar/domainmodel/App.java
index 89c848f6696c..aade9924a400 100644
--- a/domain-model/src/main/java/com/iluwatar/domainmodel/App.java
+++ b/domain-model/src/main/java/com/iluwatar/domainmodel/App.java
@@ -49,7 +49,7 @@
  */
 public class App {
 
-  public static final String H2_DB_URL = "jdbc:h2:~/test";
+  public static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
 
   public static final String CREATE_SCHEMA_SQL =
       "CREATE TABLE CUSTOMERS (name varchar primary key, money decimal);"
diff --git a/layers/src/main/resources/application.properties b/layers/src/main/resources/application.properties
index fad9b72a5ce7..233a9db6c8a5 100644
--- a/layers/src/main/resources/application.properties
+++ b/layers/src/main/resources/application.properties
@@ -2,7 +2,7 @@
 spring.main.web-application-type=none
 
 #datasource settings
-spring.datasource.url=jdbc:h2:~/databases/cake
+spring.datasource.url=jdbc:h2:mem:databases-cake
 spring.datasource.driverClassName=org.h2.Driver
 spring.datasource.username=sa
 spring.datasource.password=sa
diff --git a/repository/src/main/java/com/iluwatar/repository/AppConfig.java b/repository/src/main/java/com/iluwatar/repository/AppConfig.java
index ea93c21089e5..995c790b6e35 100644
--- a/repository/src/main/java/com/iluwatar/repository/AppConfig.java
+++ b/repository/src/main/java/com/iluwatar/repository/AppConfig.java
@@ -54,7 +54,7 @@ public class AppConfig {
   public DataSource dataSource() {
     var basicDataSource = new BasicDataSource();
     basicDataSource.setDriverClassName("org.h2.Driver");
-    basicDataSource.setUrl("jdbc:h2:~/databases/person");
+    basicDataSource.setUrl("jdbc:h2:mem:databases-person");
     basicDataSource.setUsername("sa");
     basicDataSource.setPassword("sa");
     return basicDataSource;
diff --git a/repository/src/main/resources/applicationContext.xml b/repository/src/main/resources/applicationContext.xml
index 0de00f39f01d..718b6b6e6e13 100644
--- a/repository/src/main/resources/applicationContext.xml
+++ b/repository/src/main/resources/applicationContext.xml
@@ -30,7 +30,7 @@
   </bean>
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName" value="org.h2.Driver" />
-    <property name="url" value="jdbc:h2:~/databases/person" />
+    <property name="url" value="jdbc:h2:mem:databases-person;DB_CLOSE_DELAY=-1" />
     <property name="username" value="sa" />
     <property name="password" value="sa" />
   </bean>
diff --git a/serialized-entity/README.md b/serialized-entity/README.md
index a994aa19cfbf..d18a2c83e9ad 100644
--- a/serialized-entity/README.md
+++ b/serialized-entity/README.md
@@ -136,7 +136,7 @@ methods to read and deserialize data items to `Country` objects.
 ```java
 @Slf4j
 public class App {
-    private static final String DB_URL = "jdbc:h2:~/test";
+    private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
 
     private App() {
 
diff --git a/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java b/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java
index c86102a8231e..7f1f46905875 100644
--- a/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java
+++ b/serialized-entity/src/main/java/com/iluwatar/serializedentity/App.java
@@ -48,7 +48,7 @@
  */
 @Slf4j
 public class App {
-  private static final String DB_URL = "jdbc:h2:~/test";
+  private static final String DB_URL = "jdbc:h2:mem:testdb";
 
   private App() {
 
diff --git a/table-module/src/main/java/com/iluwatar/tablemodule/App.java b/table-module/src/main/java/com/iluwatar/tablemodule/App.java
index 632b4019dfa7..1c528df8a7f5 100644
--- a/table-module/src/main/java/com/iluwatar/tablemodule/App.java
+++ b/table-module/src/main/java/com/iluwatar/tablemodule/App.java
@@ -45,7 +45,7 @@
  */
 @Slf4j
 public final class App {
-  private static final String DB_URL = "jdbc:h2:~/test";
+  private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
 
   /**
    * Private constructor.
diff --git a/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java b/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java
index 0525e6e64a63..909943ce41d4 100644
--- a/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java
+++ b/transaction-script/src/main/java/com/iluwatar/transactionscript/App.java
@@ -46,7 +46,7 @@
  */
 public class App {
 
-  private static final String H2_DB_URL = "jdbc:h2:~/test";
+  private static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
   private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
 
   /**


Test patch:
diff --git a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java
index 666c7634c158..cfa7e9882981 100644
--- a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java
+++ b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java
@@ -49,7 +49,7 @@
  */
 class DbCustomerDaoTest {
 
-  private static final String DB_URL = "jdbc:h2:~/dao";
+  private static final String DB_URL = "jdbc:h2:mem:dao;DB_CLOSE_DELAY=-1";
   private DbCustomerDao dao;
   private final Customer existingCustomer = new Customer(1, "Freddy", "Krueger");
 
diff --git a/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java b/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java
index 52ac9cd6e026..a15557d5ffdb 100644
--- a/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java
+++ b/serialized-entity/src/test/java/com/iluwatar/serializedentity/AppTest.java
@@ -1,3 +1,27 @@
+/*
+ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
+ *
+ * The MIT License
+ * Copyright © 2014-2022 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
 package com.iluwatar.serializedentity;
 
 import org.junit.jupiter.api.Test;
diff --git a/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java b/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java
index a9dc41b3e3f2..f45c20176700 100644
--- a/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java
+++ b/table-module/src/test/java/com/iluwatar/tablemodule/UserTableModuleTest.java
@@ -36,7 +36,7 @@
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 class UserTableModuleTest {
-  private static final String DB_URL = "jdbc:h2:~/test";
+  private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
 
   private static DataSource createDataSource() {
     var dataSource = new JdbcDataSource();
diff --git a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java
index ae288c703c1b..2f587397d873 100644
--- a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java
+++ b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelDaoImplTest.java
@@ -49,7 +49,7 @@
  */
 class HotelDaoImplTest {
 
-  private static final String DB_URL = "jdbc:h2:~/test";
+  private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
   private HotelDaoImpl dao;
   private Room existingRoom = new Room(1, "Single", 50, false);
 
diff --git a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java
index 1274a542a77e..e8a7f6a0b8e4 100644
--- a/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java
+++ b/transaction-script/src/test/java/com/iluwatar/transactionscript/HotelTest.java
@@ -39,7 +39,7 @@
  */
 class HotelTest {
 
-  private static final String H2_DB_URL = "jdbc:h2:~/test";
+  private static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
 
   private Hotel hotel;
   private HotelDaoImpl dao;