From 1d6450af19e1cc98110c3e06c85b18f7c2d5ac88 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Wed, 8 Nov 2017 15:42:45 +0100 Subject: [PATCH] [#6803] Cache RecordMapper instances in DefaultRecordMapperProvider --- .../src/main/java/org/jooq/conf/Settings.java | 31 +++++++++++++++++++ .../impl/DefaultRecordMapperProvider.java | 17 ++++++++-- jOOQ/src/main/java/org/jooq/impl/Fields.java | 3 ++ jOOQ/src/main/java/org/jooq/impl/Tools.java | 11 ++++--- .../resources/xsd/jooq-runtime-3.11.0.xsd | 4 +++ 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java index c2959c87d7..de5c314d62 100644 --- a/jOOQ/src/main/java/org/jooq/conf/Settings.java +++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java @@ -75,6 +75,8 @@ public class Settings protected Boolean updatablePrimaryKeys = false; @XmlElement(defaultValue = "true") protected Boolean reflectionCaching = true; + @XmlElement(defaultValue = "true") + protected Boolean cacheRecordMappers = true; @XmlElement(defaultValue = "THROW_ALL") @XmlSchemaType(name = "string") protected ThrowExceptions throwExceptions = ThrowExceptions.THROW_ALL; @@ -570,6 +572,30 @@ public class Settings this.reflectionCaching = value; } + /** + * Whether record mappers should be cached in the configuration. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isCacheRecordMappers() { + return cacheRecordMappers; + } + + /** + * Sets the value of the cacheRecordMappers property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setCacheRecordMappers(Boolean value) { + this.cacheRecordMappers = value; + } + /** * A strategy defining how exceptions from the database / JDBC driver should be propagated * @@ -1004,6 +1030,11 @@ public class Settings return this; } + public Settings withCacheRecordMappers(Boolean value) { + setCacheRecordMappers(value); + return this; + } + public Settings withThrowExceptions(ThrowExceptions value) { setThrowExceptions(value); return this; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapperProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapperProvider.java index 6adc79ccc2..3f05f59b15 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapperProvider.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapperProvider.java @@ -34,6 +34,9 @@ */ package org.jooq.impl; +import static java.lang.Boolean.TRUE; +import static org.jooq.impl.Tools.DATA_CACHE_RECORD_MAPPERS; + import java.io.Serializable; import org.jooq.Configuration; @@ -41,6 +44,8 @@ import org.jooq.Record; import org.jooq.RecordMapper; import org.jooq.RecordMapperProvider; import org.jooq.RecordType; +import org.jooq.impl.Tools.Cache; +import org.jooq.impl.Tools.Cache.CachedOperation; /** * A default {@link RecordMapperProvider} implementation, providing a @@ -71,7 +76,15 @@ public class DefaultRecordMapperProvider implements RecordMapperProvider, Serial } @Override - public final RecordMapper provide(RecordType rowType, Class type) { - return new DefaultRecordMapper(rowType, type, configuration); + public final RecordMapper provide(final RecordType rowType, final Class type) { + if (TRUE.equals(configuration.settings().isCacheRecordMappers())) + return Cache.run(configuration, new CachedOperation>() { + @Override + public RecordMapper call() { + return new DefaultRecordMapper(rowType, type, configuration); + } + }, DATA_CACHE_RECORD_MAPPERS, Cache.key(rowType, type)); + else + return new DefaultRecordMapper(rowType, type, configuration); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Fields.java b/jOOQ/src/main/java/org/jooq/impl/Fields.java index 08594e8631..3e5568429c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Fields.java +++ b/jOOQ/src/main/java/org/jooq/impl/Fields.java @@ -406,6 +406,9 @@ final class Fields extends AbstractQueryPart implements Record @Override public boolean equals(Object that) { + if (this == that) + return true; + if (that instanceof Fields) return Arrays.equals(fields, ((Fields) that).fields); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 4b509aee72..4b83aa1acd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -471,6 +471,7 @@ final class Tools { static final String DATA_REFLECTION_CACHE_GET_MATCHING_MEMBERS = new String("org.jooq.configuration.reflection-cache.get-matching-members"); static final String DATA_REFLECTION_CACHE_GET_MATCHING_SETTERS = new String("org.jooq.configuration.reflection-cache.get-matching-setters"); static final String DATA_REFLECTION_CACHE_HAS_COLUMN_ANNOTATIONS = new String("org.jooq.configuration.reflection-cache.has-column-annotations"); + static final String DATA_CACHE_RECORD_MAPPERS = new String("org.jooq.configuration.cache.record-mappers"); // ------------------------------------------------------------------------ // Other constants @@ -2685,7 +2686,7 @@ final class Tools { /** * Create a single-value or multi-value key for caching. */ - static final Object key(Serializable key1, Serializable key2) { + static final Object key(Object key1, Object key2) { return new Key2(key1, key2); } @@ -2697,11 +2698,11 @@ final class Tools { /** * Generated UID. */ - private static final long serialVersionUID = 5822370287443922993L; - private final Serializable key1; - private final Serializable key2; + private static final long serialVersionUID = 5822370287443922993L; + private final Object key1; + private final Object key2; - Key2(Serializable key1, Serializable key2) { + Key2(Object key1, Object key2) { this.key1 = key1; this.key2 = key2; } diff --git a/jOOQ/src/main/resources/xsd/jooq-runtime-3.11.0.xsd b/jOOQ/src/main/resources/xsd/jooq-runtime-3.11.0.xsd index a99fe4e286..20cbdc26e8 100644 --- a/jOOQ/src/main/resources/xsd/jooq-runtime-3.11.0.xsd +++ b/jOOQ/src/main/resources/xsd/jooq-runtime-3.11.0.xsd @@ -115,6 +115,10 @@ UpdatableRecord.store() and UpdatableRecord.update().]]> + + + +