killbill-aplcache

server: switch to h2 as default Make Kill Bill use h2 instead

3/9/2014 6:04:41 PM

Details

.gitignore 3(+3 -0)

diff --git a/.gitignore b/.gitignore
index 0ee703f..c26b0f3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,6 @@ catalog/src/test/resources/CatalogSchema.xsd
 server/load
 dependency-reduced-pom.xml
 dependency-reduced-pom.xml.bak
+server/killbill.h2.db
+server/killbill.lock.db
+server/killbill.trace.db
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
index 6d9e150..207db47 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
@@ -20,8 +20,6 @@ import java.io.IOException;
 import java.net.URL;
 import java.util.Set;
 
-import org.skife.config.ConfigSource;
-
 import org.killbill.billing.DBTestingHelper;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.account.api.AccountService;
@@ -40,7 +38,6 @@ import org.killbill.billing.beatrix.util.RefundChecker;
 import org.killbill.billing.beatrix.util.SubscriptionChecker;
 import org.killbill.billing.catalog.api.CatalogService;
 import org.killbill.billing.catalog.glue.CatalogModule;
-import org.killbill.commons.embeddeddb.EmbeddedDB;
 import org.killbill.billing.currency.glue.CurrencyModule;
 import org.killbill.billing.entitlement.EntitlementService;
 import org.killbill.billing.entitlement.glue.DefaultEntitlementModule;
@@ -50,7 +47,6 @@ import org.killbill.billing.invoice.generator.InvoiceGenerator;
 import org.killbill.billing.invoice.glue.DefaultInvoiceModule;
 import org.killbill.billing.junction.glue.DefaultJunctionModule;
 import org.killbill.billing.lifecycle.KillbillService;
-import org.killbill.billing.mock.glue.MockGlobalLockerModule;
 import org.killbill.billing.osgi.DefaultOSGIService;
 import org.killbill.billing.osgi.glue.DefaultOSGIModule;
 import org.killbill.billing.overdue.OverdueService;
@@ -77,6 +73,7 @@ import org.killbill.billing.util.glue.NotificationQueueModule;
 import org.killbill.billing.util.glue.RecordIdModule;
 import org.killbill.billing.util.glue.TagStoreModule;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.skife.config.ConfigSource;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.AbstractModule;
@@ -103,12 +100,7 @@ public class BeatrixIntegrationModule extends AbstractModule {
         loadSystemPropertiesFromClasspath("/beatrix.properties");
 
         install(new GuicyKillbillTestWithEmbeddedDBModule());
-
-        if (EmbeddedDB.DBEngine.MYSQL.equals(DBTestingHelper.get().getDBEngine())) {
-            install(new GlobalLockerModule());
-        } else {
-            install(new MockGlobalLockerModule());
-        }
+        install(new GlobalLockerModule(DBTestingHelper.get().getDBEngine()));
         install(new CacheModule(configSource));
         install(new EmailModule(configSource));
         install(new CallContextModule());

bin/start-server 4(+2 -2)

diff --git a/bin/start-server b/bin/start-server
index 72e86b4..77711fd 100755
--- a/bin/start-server
+++ b/bin/start-server
@@ -55,8 +55,8 @@ function build_properties() {
     local opts=
     local prop=
     for prop in `cat  $PROPERTIES | grep =`; do
-        local k=`echo $prop | awk '  BEGIN {FS="="} { print $1 }'`
-        local v=`echo $prop | awk 'BEGIN {FS="="} { print $2 }'`
+        local k=`echo $prop | awk 'BEGIN {FS="="} { print $1 }'`
+        local v=`echo $prop | awk 'BEGIN {FS="="} {for (i=2; i<NF; i++) printf $i "="; print $NF}'`
         opts="$opts -D$k=$v"
     done
     echo $opts
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
index 6f0aefa..e601ca8 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
@@ -16,12 +16,12 @@
 
 package org.killbill.billing.invoice.glue;
 
+import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
 import org.mockito.Mockito;
 import org.skife.config.ConfigSource;
 
 import org.killbill.billing.catalog.glue.CatalogModule;
 import org.killbill.billing.invoice.TestInvoiceHelper;
-import org.killbill.billing.mock.glue.MockGlobalLockerModule;
 import org.killbill.billing.util.email.EmailModule;
 import org.killbill.billing.util.email.templates.TemplateModule;
 import org.killbill.billing.util.glue.CacheModule;
@@ -48,7 +48,7 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
     protected void configure() {
         super.configure();
         install(new CallContextModule());
-        install(new MockGlobalLockerModule());
+        install(new MemoryGlobalLockerModule());
 
         install(new CatalogModule(configSource));
         install(new CacheModule(configSource));
diff --git a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
index 2f9be13..2d8d3e7 100644
--- a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
+++ b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
@@ -18,13 +18,13 @@ package org.killbill.billing.payment.glue;
 
 import java.util.UUID;
 
+import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
 import org.mockito.Mockito;
 import org.skife.config.ConfigSource;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.mock.glue.MockAccountModule;
 import org.killbill.billing.mock.glue.MockSubscriptionModule;
-import org.killbill.billing.mock.glue.MockGlobalLockerModule;
 import org.killbill.billing.mock.glue.MockInvoiceModule;
 import org.killbill.billing.mock.glue.MockNotificationQueueModule;
 import org.killbill.billing.payment.TestPaymentHelper;
@@ -68,7 +68,7 @@ public class TestPaymentModule extends PaymentModule {
         install(new MockInvoiceModule());
         install(new MockAccountModule());
         install(new MockSubscriptionModule());
-        install(new MockGlobalLockerModule());
+        install(new MemoryGlobalLockerModule());
         install(new CacheModule(configSource));
         installExternalApis();
 

server/pom.xml 10(+8 -2)

diff --git a/server/pom.xml b/server/pom.xml
index 5700f3a..8fca5b1 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -88,6 +88,7 @@
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.mchange</groupId>
@@ -263,8 +264,13 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
-            <artifactId>killbill-embeddeddb-common</artifactId>
-            <version>${killbill-commons.version}</version>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
diff --git a/server/src/main/java/org/killbill/billing/server/dao/EmbeddedDBFactory.java b/server/src/main/java/org/killbill/billing/server/dao/EmbeddedDBFactory.java
new file mode 100644
index 0000000..475800c
--- /dev/null
+++ b/server/src/main/java/org/killbill/billing/server/dao/EmbeddedDBFactory.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010-2014 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.server.dao;
+
+import java.net.URI;
+
+import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.killbill.commons.embeddeddb.GenericStandaloneDB;
+import org.killbill.commons.embeddeddb.h2.H2EmbeddedDB;
+import org.killbill.commons.embeddeddb.mysql.MySQLStandaloneDB;
+
+public class EmbeddedDBFactory {
+
+    private EmbeddedDBFactory() { }
+
+    public static EmbeddedDB get(final DaoConfig config) {
+        final URI uri = URI.create(config.getJdbcUrl().substring(5));
+
+        final String databaseName;
+        final String schemeLocation;
+        if (uri.getPath() != null) {
+            schemeLocation = null;
+            databaseName = uri.getPath().split("/")[1].split(";")[0];
+        } else if (uri.getSchemeSpecificPart() != null) {
+            final String[] schemeParts = uri.getSchemeSpecificPart().split(":");
+            schemeLocation = schemeParts[0];
+            databaseName = schemeParts[1].split(";")[0];
+        } else {
+            schemeLocation = null;
+            databaseName = null;
+        }
+
+        if ("mysql".equals(uri.getScheme())) {
+            return new MySQLStandaloneDB(databaseName, config.getUsername(), config.getPassword(), config.getJdbcUrl());
+        } else if ("h2".equals(uri.getScheme()) && ("mem".equals(schemeLocation) || "file".equals(schemeLocation))) {
+            return new H2EmbeddedDB(databaseName, config.getUsername(), config.getPassword(), config.getJdbcUrl());
+        } else {
+            return new GenericStandaloneDB(databaseName, config.getUsername(), config.getPassword(), config.getJdbcUrl());
+        }
+    }
+}
diff --git a/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java b/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
index ca796d2..853185d 100644
--- a/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
+++ b/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
@@ -16,6 +16,7 @@
 
 package org.killbill.billing.server.listeners;
 
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
 
 import javax.management.MBeanServer;
@@ -33,6 +34,7 @@ import org.killbill.billing.server.security.TenantFilter;
 import org.killbill.billing.util.jackson.ObjectMapper;
 import org.killbill.billing.util.svcsapi.bus.BusService;
 import org.killbill.bus.api.PersistentBus;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
 import org.killbill.commons.skeleton.listeners.GuiceServletContextListener;
 import org.killbill.commons.skeleton.modules.BaseServerModuleBuilder;
 import org.killbill.commons.skeleton.modules.ConfigModule;
@@ -60,13 +62,15 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
     public static final Logger logger = LoggerFactory.getLogger(KillbillGuiceListener.class);
 
     private KillbillServerConfig config;
+    private DaoConfig daoConfig;
     private Injector injector;
     private DefaultLifecycle killbillLifecycle;
     private BusService killbillBusService;
     private KillbillEventHandler killbilleventHandler;
+    private EmbeddedDB embeddedDB;
 
     protected Module getModule(final ServletContext servletContext) {
-        return new KillbillServerModule(servletContext, config.isTestModeEnabled());
+        return new KillbillServerModule(servletContext, daoConfig, config.isTestModeEnabled());
     }
 
     private void registerMBeansForCache(final CacheManager cacheManager) {
@@ -79,6 +83,7 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
     @Override
     public void contextInitialized(final ServletContextEvent event) {
         config = new ConfigurationObjectFactory(System.getProperties()).build(KillbillServerConfig.class);
+        daoConfig = new ConfigurationObjectFactory(System.getProperties()).build(DaoConfig.class);
 
         // Don't filter all requests through Jersey, only the JAX-RS APIs (otherwise,
         // things like static resources, favicon, etc. are 404'ed)
@@ -111,6 +116,8 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
         killbillLifecycle = injector.getInstance(DefaultLifecycle.class);
         killbillBusService = injector.getInstance(BusService.class);
         killbilleventHandler = injector.getInstance(KillbillEventHandler.class);
+        // Already started at this point
+        embeddedDB = injector.getInstance(EmbeddedDB.class);
 
         registerMBeansForCache(injector.getInstance(CacheManager.class));
 
@@ -152,6 +159,13 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
 
         // Complete shutdown sequence
         killbillLifecycle.fireShutdownSequencePostEventUnRegistration();
+
+        if (embeddedDB != null) {
+            try {
+                embeddedDB.stop();
+            } catch (final IOException ignored) {
+            }
+        }
     }
 
     @VisibleForTesting
diff --git a/server/src/main/java/org/killbill/billing/server/modules/EmbeddedDBProvider.java b/server/src/main/java/org/killbill/billing/server/modules/EmbeddedDBProvider.java
new file mode 100644
index 0000000..bae328c
--- /dev/null
+++ b/server/src/main/java/org/killbill/billing/server/modules/EmbeddedDBProvider.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010-2014 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.server.modules;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+
+import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.billing.server.dao.EmbeddedDBFactory;
+import org.killbill.billing.util.io.IOUtils;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.killbill.commons.embeddeddb.EmbeddedDB.DBEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.io.Resources;
+import com.google.inject.Provider;
+
+public class EmbeddedDBProvider implements Provider<EmbeddedDB> {
+
+    private static final Logger logger = LoggerFactory.getLogger(EmbeddedDBProvider.class);
+
+    private final DaoConfig config;
+
+    @Inject
+    public EmbeddedDBProvider(final DaoConfig config) {
+        this.config = config;
+    }
+
+    @Override
+    public EmbeddedDB get() {
+        final EmbeddedDB embeddedDB = EmbeddedDBFactory.get(config);
+
+        if (DBEngine.H2.equals(embeddedDB.getDBEngine())) {
+            try {
+                // Standalone mode?
+                initializeEmbeddedDB(embeddedDB);
+            } catch (final IOException e) {
+                logger.error("Error while initializing H2, opportunistically continuing the startup sequence", e);
+            }
+        }
+
+        return embeddedDB;
+    }
+
+    private void initializeEmbeddedDB(final EmbeddedDB embeddedDB) throws IOException {
+        embeddedDB.initialize();
+        embeddedDB.start();
+
+        // If the tables have not been created yet, do it, otherwise don't clobber them
+        if (!embeddedDB.getAllTables().isEmpty()) {
+            return;
+        }
+
+        for (final String module : new String[]{"account",
+                                                "beatrix",
+                                                "entitlement",
+                                                "invoice",
+                                                "payment",
+                                                "subscription",
+                                                "tenant",
+                                                "usage",
+                                                "util"}) {
+            final String ddl = IOUtils.toString(Resources.getResource("org/killbill/billing/" + module + "/ddl.sql").openStream());
+            embeddedDB.executeScript(ddl);
+        }
+        embeddedDB.refreshTableNames();
+    }
+}
diff --git a/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java b/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
index 5bd75a2..d145ce6 100644
--- a/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
+++ b/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
@@ -19,16 +19,9 @@ package org.killbill.billing.server.modules;
 import javax.servlet.ServletContext;
 import javax.sql.DataSource;
 
-import org.skife.config.ConfigSource;
-import org.skife.config.SimplePropertyConfigSource;
-import org.skife.jdbi.v2.DBI;
-import org.skife.jdbi.v2.IDBI;
-
 import org.killbill.billing.account.glue.DefaultAccountModule;
 import org.killbill.billing.beatrix.glue.BeatrixModule;
 import org.killbill.billing.catalog.glue.CatalogModule;
-import org.killbill.clock.Clock;
-import org.killbill.clock.ClockMock;
 import org.killbill.billing.currency.glue.CurrencyModule;
 import org.killbill.billing.entitlement.glue.DefaultEntitlementModule;
 import org.killbill.billing.invoice.glue.DefaultInvoiceModule;
@@ -54,6 +47,7 @@ import org.killbill.billing.overdue.glue.DefaultOverdueModule;
 import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.server.DefaultServerService;
 import org.killbill.billing.server.ServerService;
+import org.killbill.billing.server.config.DaoConfig;
 import org.killbill.billing.server.notifications.PushNotificationListener;
 import org.killbill.billing.subscription.glue.DefaultSubscriptionModule;
 import org.killbill.billing.tenant.glue.TenantModule;
@@ -69,22 +63,30 @@ import org.killbill.billing.util.glue.CustomFieldModule;
 import org.killbill.billing.util.glue.ExportModule;
 import org.killbill.billing.util.glue.GlobalLockerModule;
 import org.killbill.billing.util.glue.KillBillShiroAopModule;
-import org.killbill.billing.util.glue.MetricsModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.NotificationQueueModule;
 import org.killbill.billing.util.glue.RecordIdModule;
 import org.killbill.billing.util.glue.SecurityModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.clock.Clock;
+import org.killbill.clock.ClockMock;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.skife.config.ConfigSource;
+import org.skife.config.SimplePropertyConfigSource;
+import org.skife.jdbi.v2.DBI;
+import org.skife.jdbi.v2.IDBI;
 
 import com.google.inject.AbstractModule;
 
 public class KillbillServerModule extends AbstractModule {
 
     protected final ServletContext servletContext;
+    private final DaoConfig daoConfig;
     private final boolean isTestModeEnabled;
 
-    public KillbillServerModule(final ServletContext servletContext, final boolean testModeEnabled) {
+    public KillbillServerModule(final ServletContext servletContext, final DaoConfig daoConfig, final boolean testModeEnabled) {
         this.servletContext = servletContext;
+        this.daoConfig = daoConfig;
         this.isTestModeEnabled = testModeEnabled;
     }
 
@@ -144,9 +146,14 @@ public class KillbillServerModule extends AbstractModule {
     protected void installKillbillModules() {
         final ConfigSource configSource = new SimplePropertyConfigSource(System.getProperties());
 
+        // TODO Pierre Refactor GlobalLockerModule for this to be a real provider?
+        final EmbeddedDBProvider embeddedDBProvider = new EmbeddedDBProvider(daoConfig);
+        final EmbeddedDB embeddedDB = embeddedDBProvider.get();
+        bind(EmbeddedDB.class).toInstance(embeddedDB);
+
         install(new EmailModule(configSource));
         install(new CacheModule(configSource));
-        install(new GlobalLockerModule());
+        install(new GlobalLockerModule(embeddedDB.getDBEngine()));
         install(new CustomFieldModule());
         install(new AuditModule());
         install(new CatalogModule(configSource));
diff --git a/server/src/main/resources/killbill-server.properties b/server/src/main/resources/killbill-server.properties
index 3d85b58..27b7c9c 100644
--- a/server/src/main/resources/killbill-server.properties
+++ b/server/src/main/resources/killbill-server.properties
@@ -16,7 +16,7 @@
 
 
 # Use skeleton properties for server and configure killbill database
-org.killbill.dao.url=jdbc:mysql://127.0.0.1:3306/killbill
+org.killbill.dao.url=jdbc:h2:file:killbill;MODE=MYSQL;DB_CLOSE_DELAY=-1;MVCC=true;DB_CLOSE_ON_EXIT=FALSE
 org.killbill.dao.user=root
 org.killbill.dao.password=root
 
diff --git a/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index 62f9b5e..a1845ec 100644
--- a/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -52,6 +52,7 @@ import org.killbill.billing.osgi.glue.DefaultOSGIModule;
 import org.killbill.billing.overdue.glue.DefaultOverdueModule;
 import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.payment.provider.MockPaymentProviderPluginModule;
+import org.killbill.billing.server.config.DaoConfig;
 import org.killbill.billing.server.listeners.KillbillGuiceListener;
 import org.killbill.billing.server.modules.KillBillShiroWebModule;
 import org.killbill.billing.server.modules.KillbillServerModule;
@@ -62,22 +63,20 @@ import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.config.PaymentConfig;
 import org.killbill.billing.util.email.EmailModule;
 import org.killbill.billing.util.email.templates.TemplateModule;
-import org.killbill.billing.util.globallocker.TestGlobalLockerModule;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.BusModule;
 import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.CallContextModule;
 import org.killbill.billing.util.glue.CustomFieldModule;
 import org.killbill.billing.util.glue.ExportModule;
+import org.killbill.billing.util.glue.GlobalLockerModule;
 import org.killbill.billing.util.glue.KillBillShiroAopModule;
-import org.killbill.billing.util.glue.MetricsModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.NotificationQueueModule;
 import org.killbill.billing.util.glue.RecordIdModule;
 import org.killbill.billing.util.glue.SecurityModule;
 import org.killbill.billing.util.glue.TagStoreModule;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.commons.embeddeddb.EmbeddedDB;
 import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.annotations.AfterMethod;
@@ -103,7 +102,8 @@ public class TestJaxrsBase extends KillbillClient {
     protected CacheControllerDispatcher cacheControllerDispatcher;
 
     @Inject
-    protected @javax.inject.Named(BeatrixModule.EXTERNAL_BUS) PersistentBus externalBus;
+    protected @javax.inject.Named(BeatrixModule.EXTERNAL_BUS)
+    PersistentBus externalBus;
 
     @Inject
     protected PersistentBus internalBus;
@@ -128,16 +128,16 @@ public class TestJaxrsBase extends KillbillClient {
 
     public static class TestKillbillGuiceListener extends KillbillGuiceListener {
 
-        private final EmbeddedDB helper;
+        private final DaoConfig daoConfig;
 
-        public TestKillbillGuiceListener(final EmbeddedDB helper) {
+        public TestKillbillGuiceListener(final DaoConfig daoConfig) {
             super();
-            this.helper = helper;
+            this.daoConfig = daoConfig;
         }
 
         @Override
         protected Module getModule(final ServletContext servletContext) {
-            return new TestKillbillServerModule(helper, servletContext);
+            return new TestKillbillServerModule(daoConfig, servletContext);
         }
 
     }
@@ -156,11 +156,8 @@ public class TestJaxrsBase extends KillbillClient {
 
     public static class TestKillbillServerModule extends KillbillServerModule {
 
-        private final EmbeddedDB helper;
-
-        public TestKillbillServerModule(final EmbeddedDB helper, final ServletContext servletContext) {
-            super(servletContext, false);
-            this.helper = helper;
+        public TestKillbillServerModule(final DaoConfig daoConfig, final ServletContext servletContext) {
+            super(servletContext, daoConfig, false);
         }
 
         @Override
@@ -201,7 +198,7 @@ public class TestJaxrsBase extends KillbillClient {
             install(new EmailModule(configSource));
             install(new CacheModule(configSource));
             install(new NonEntityDaoModule());
-            install(new TestGlobalLockerModule(DBTestingHelper.get()));
+            install(new GlobalLockerModule(DBTestingHelper.get().getDBEngine()));
             install(new CustomFieldModule());
             install(new TagStoreModule());
             install(new AuditModule());
@@ -310,7 +307,7 @@ public class TestJaxrsBase extends KillbillClient {
         loadSystemPropertiesFromClasspath("/killbill.properties");
         loadConfig();
 
-        listener = new TestKillbillGuiceListener(helper);
+        listener = new TestKillbillGuiceListener(new ConfigurationObjectFactory(System.getProperties()).build(DaoConfig.class));
 
         server = new HttpServer();
         server.configure(config, getListeners(), getFilters());
diff --git a/server/src/test/java/org/killbill/billing/server/dao/TestEmbeddedDBFactory.java b/server/src/test/java/org/killbill/billing/server/dao/TestEmbeddedDBFactory.java
new file mode 100644
index 0000000..05dde7d
--- /dev/null
+++ b/server/src/test/java/org/killbill/billing/server/dao/TestEmbeddedDBFactory.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2010-2014 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.server.dao;
+
+import java.util.Properties;
+
+import org.killbill.billing.KillbillTestSuite;
+import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.killbill.commons.embeddeddb.EmbeddedDB.DBEngine;
+import org.skife.config.ConfigurationObjectFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class TestEmbeddedDBFactory extends KillbillTestSuite {
+
+    @Test(groups = "fast")
+    public void testJdbcParser() throws Exception {
+        final EmbeddedDB mysqlEmbeddedDb = EmbeddedDBFactory.get(createDaoConfig("jdbc:mysql://127.0.0.1:3306/killbill", "root", "root"));
+        Assert.assertEquals(mysqlEmbeddedDb.getDBEngine(), DBEngine.MYSQL);
+        checkEmbeddedDb(mysqlEmbeddedDb);
+
+        final EmbeddedDB h2EmbeddedDb = EmbeddedDBFactory.get(createDaoConfig("jdbc:h2:file:killbill;MODE=MYSQL;DB_CLOSE_DELAY=-1;MVCC=true;DB_CLOSE_ON_EXIT=FALSE", "root", "root"));
+        Assert.assertEquals(h2EmbeddedDb.getDBEngine(), DBEngine.H2);
+        checkEmbeddedDb(h2EmbeddedDb);
+
+        final EmbeddedDB genericEmbeddedDb = EmbeddedDBFactory.get(createDaoConfig("jdbc:derby://localhost:1527/killbill;collation=TERRITORY_BASED:PRIMARY", "root", "root"));
+        Assert.assertEquals(genericEmbeddedDb.getDBEngine(), DBEngine.GENERIC);
+        checkEmbeddedDb(genericEmbeddedDb);
+    }
+
+    private void checkEmbeddedDb(final EmbeddedDB embeddedDb) {
+        Assert.assertEquals(embeddedDb.getDatabaseName(), "killbill");
+        Assert.assertEquals(embeddedDb.getUsername(), "root");
+        Assert.assertEquals(embeddedDb.getPassword(), "root");
+    }
+
+    private DaoConfig createDaoConfig(final String url, final String user, final String password) {
+        final Properties properties = new Properties();
+        properties.put("org.killbill.dao.url", url);
+        properties.put("org.killbill.dao.user", user);
+        properties.put("org.killbill.dao.password", password);
+        return new ConfigurationObjectFactory(properties).build(DaoConfig.class);
+    }
+}

util/pom.xml 2(+1 -1)

diff --git a/util/pom.xml b/util/pom.xml
index 50b3ce3..3a2d54b 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -149,7 +149,7 @@
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-embeddeddb-common</artifactId>
-            <scope>test</scope>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
diff --git a/util/src/main/java/org/killbill/billing/util/glue/GlobalLockerModule.java b/util/src/main/java/org/killbill/billing/util/glue/GlobalLockerModule.java
index 65faead..3bcd3e8 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/GlobalLockerModule.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/GlobalLockerModule.java
@@ -16,14 +16,25 @@
 
 package org.killbill.billing.util.glue;
 
-import org.killbill.commons.locker.GlobalLocker;
+import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.killbill.commons.embeddeddb.EmbeddedDB.DBEngine;
 
 import com.google.inject.AbstractModule;
 
 public class GlobalLockerModule extends AbstractModule {
 
+    private final DBEngine engine;
+
+    public GlobalLockerModule(final DBEngine engine) {
+        this.engine = engine;
+    }
+
     @Override
     protected void configure() {
-        bind(GlobalLocker.class).toProvider(MySqlGlobalLockerProvider.class).asEagerSingleton();
+        if (EmbeddedDB.DBEngine.MYSQL.equals(engine)) {
+            install(new MySqlGlobalLockerModule());
+        } else {
+            install(new MemoryGlobalLockerModule());
+        }
     }
 }
diff --git a/util/src/main/java/org/killbill/billing/util/glue/MySqlGlobalLockerModule.java b/util/src/main/java/org/killbill/billing/util/glue/MySqlGlobalLockerModule.java
new file mode 100644
index 0000000..5c2d426
--- /dev/null
+++ b/util/src/main/java/org/killbill/billing/util/glue/MySqlGlobalLockerModule.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.util.glue;
+
+import org.killbill.commons.locker.GlobalLocker;
+
+import com.google.inject.AbstractModule;
+
+public class MySqlGlobalLockerModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+        bind(GlobalLocker.class).toProvider(MySqlGlobalLockerProvider.class).asEagerSingleton();
+    }
+}
diff --git a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
index 349f3f8..76c37f8 100644
--- a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
+++ b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
@@ -21,7 +21,6 @@ import org.skife.config.ConfigSource;
 import org.killbill.billing.DBTestingHelper;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.api.TestApiListener;
-import org.killbill.billing.util.globallocker.TestGlobalLockerModule;
 
 public class TestUtilModuleWithEmbeddedDB extends TestUtilModule {
 
@@ -41,7 +40,7 @@ public class TestUtilModuleWithEmbeddedDB extends TestUtilModule {
         install(new BusModule(configSource));
         install(new NotificationQueueModule(configSource));
         install(new NonEntityDaoModule());
-        install(new TestGlobalLockerModule(DBTestingHelper.get()));
+        install(new GlobalLockerModule(DBTestingHelper.get().getDBEngine()));
 
         bind(TestApiListener.class).asEagerSingleton();
     }