diff --git a/core/src/main/java/google/registry/persistence/transaction/TransactionManagerFactory.java b/core/src/main/java/google/registry/persistence/transaction/TransactionManagerFactory.java index 694d68474..d58e12f09 100644 --- a/core/src/main/java/google/registry/persistence/transaction/TransactionManagerFactory.java +++ b/core/src/main/java/google/registry/persistence/transaction/TransactionManagerFactory.java @@ -17,16 +17,23 @@ package google.registry.persistence.transaction; import com.google.appengine.api.utils.SystemProperty; import com.google.appengine.api.utils.SystemProperty.Environment.Value; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Suppliers; import google.registry.model.ofy.DatastoreTransactionManager; import google.registry.persistence.DaggerPersistenceComponent; import google.registry.tools.RegistryToolEnvironment; +import google.registry.util.NonFinalForTesting; +import java.util.function.Supplier; /** Factory class to create {@link TransactionManager} instance. */ // TODO: Rename this to PersistenceFactory and move to persistence package. public class TransactionManagerFactory { private static final TransactionManager TM = createTransactionManager(); - @VisibleForTesting static JpaTransactionManager jpaTm = createJpaTransactionManager(); + + /** Supplier for jpaTm so that it is initialized only once, upon first usage. */ + @NonFinalForTesting + private static Supplier jpaTm = + Suppliers.memoize(TransactionManagerFactory::createJpaTransactionManager); private TransactionManagerFactory() {} @@ -68,6 +75,11 @@ public class TransactionManagerFactory { /** Returns {@link JpaTransactionManager} instance. */ public static JpaTransactionManager jpaTm() { - return jpaTm; + return jpaTm.get(); + } + + @VisibleForTesting + static void setJpaTmForTesting(JpaTransactionManager newJpaTm) { + jpaTm = Suppliers.ofInstance(newJpaTm); } } diff --git a/core/src/main/java/google/registry/tools/RegistryCli.java b/core/src/main/java/google/registry/tools/RegistryCli.java index 0a3542f2e..717da183c 100644 --- a/core/src/main/java/google/registry/tools/RegistryCli.java +++ b/core/src/main/java/google/registry/tools/RegistryCli.java @@ -237,7 +237,7 @@ final class RegistryCli implements AutoCloseable, CommandRunner { // Enable Cloud SQL for command that needs remote API as they will very likely use // Cloud SQL after the database migration. Note that the DB password is stored in Datastore // and it is already initialized above. - RegistryToolEnvironment.get().enableJpaTm(); + RegistryToolEnvironment.enableJpaTm(); } command.run(); diff --git a/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerRule.java b/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerRule.java index 1ed2330cf..ae99e72ec 100644 --- a/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerRule.java +++ b/core/src/test/java/google/registry/persistence/transaction/JpaTransactionManagerRule.java @@ -132,13 +132,13 @@ abstract class JpaTransactionManagerRule extends ExternalResource { properties, extraEntityClasses); JpaTransactionManagerImpl txnManager = new JpaTransactionManagerImpl(emf, clock); - cachedTm = TransactionManagerFactory.jpaTm; - TransactionManagerFactory.jpaTm = txnManager; + cachedTm = TransactionManagerFactory.jpaTm(); + TransactionManagerFactory.setJpaTmForTesting(txnManager); } @Override public void after() { - TransactionManagerFactory.jpaTm = cachedTm; + TransactionManagerFactory.setJpaTmForTesting(cachedTm); if (emf != null) { emf.close(); emf = null;