diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java index 07f582f5b387..d050af335273 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java @@ -19,7 +19,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; +import java.util.Map; +import java.util.Set; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -228,6 +232,14 @@ protected Collection getUrlPrefixes() { private final String validationQuery; + private static final Map> URL_PREFIX_CACHE = new HashMap<>(); + + static { + for (DatabaseDriver driver : values()) { + URL_PREFIX_CACHE.put(driver, new HashSet<>(driver.getUrlPrefixes())); + } + } + DatabaseDriver(String productName, String driverClassName) { this(productName, driverClassName, null); } @@ -296,8 +308,9 @@ public static DatabaseDriver fromJdbcUrl(String url) { if (StringUtils.hasLength(url)) { Assert.isTrue(url.startsWith("jdbc"), "URL must start with 'jdbc'"); String urlWithoutPrefix = url.substring("jdbc".length()).toLowerCase(Locale.ENGLISH); - for (DatabaseDriver driver : values()) { - for (String urlPrefix : driver.getUrlPrefixes()) { + for (Map.Entry> entry : URL_PREFIX_CACHE.entrySet()) { + DatabaseDriver driver = entry.getKey(); + for (String urlPrefix : entry.getValue()) { String prefix = ":" + urlPrefix + ":"; if (driver != UNKNOWN && urlWithoutPrefix.startsWith(prefix)) { return driver; @@ -308,6 +321,7 @@ public static DatabaseDriver fromJdbcUrl(String url) { return UNKNOWN; } + /** * Find a {@link DatabaseDriver} for the given product name. * @param productName product name