Skip to content

Commit

Permalink
[#6803] Cache RecordMapper instances in DefaultRecordMapperProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaseder committed Nov 8, 2017
1 parent aea236d commit 1d6450a
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 7 deletions.
31 changes: 31 additions & 0 deletions jOOQ/src/main/java/org/jooq/conf/Settings.java
Expand Up @@ -75,6 +75,8 @@ public class Settings
protected Boolean updatablePrimaryKeys = false; protected Boolean updatablePrimaryKeys = false;
@XmlElement(defaultValue = "true") @XmlElement(defaultValue = "true")
protected Boolean reflectionCaching = true; protected Boolean reflectionCaching = true;
@XmlElement(defaultValue = "true")
protected Boolean cacheRecordMappers = true;
@XmlElement(defaultValue = "THROW_ALL") @XmlElement(defaultValue = "THROW_ALL")
@XmlSchemaType(name = "string") @XmlSchemaType(name = "string")
protected ThrowExceptions throwExceptions = ThrowExceptions.THROW_ALL; protected ThrowExceptions throwExceptions = ThrowExceptions.THROW_ALL;
Expand Down Expand Up @@ -570,6 +572,30 @@ public void setReflectionCaching(Boolean value) {
this.reflectionCaching = value; 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 * A strategy defining how exceptions from the database / JDBC driver should be propagated
* *
Expand Down Expand Up @@ -1004,6 +1030,11 @@ public Settings withReflectionCaching(Boolean value) {
return this; return this;
} }


public Settings withCacheRecordMappers(Boolean value) {
setCacheRecordMappers(value);
return this;
}

public Settings withThrowExceptions(ThrowExceptions value) { public Settings withThrowExceptions(ThrowExceptions value) {
setThrowExceptions(value); setThrowExceptions(value);
return this; return this;
Expand Down
17 changes: 15 additions & 2 deletions jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapperProvider.java
Expand Up @@ -34,13 +34,18 @@
*/ */
package org.jooq.impl; 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 java.io.Serializable;


import org.jooq.Configuration; import org.jooq.Configuration;
import org.jooq.Record; import org.jooq.Record;
import org.jooq.RecordMapper; import org.jooq.RecordMapper;
import org.jooq.RecordMapperProvider; import org.jooq.RecordMapperProvider;
import org.jooq.RecordType; import org.jooq.RecordType;
import org.jooq.impl.Tools.Cache;
import org.jooq.impl.Tools.Cache.CachedOperation;


/** /**
* A default {@link RecordMapperProvider} implementation, providing a * A default {@link RecordMapperProvider} implementation, providing a
Expand Down Expand Up @@ -71,7 +76,15 @@ protected DefaultRecordMapperProvider(Configuration configuration) {
} }


@Override @Override
public final <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> rowType, Class<? extends E> type) { public final <R extends Record, E> RecordMapper<R, E> provide(final RecordType<R> rowType, final Class<? extends E> type) {
return new DefaultRecordMapper<R, E>(rowType, type, configuration); if (TRUE.equals(configuration.settings().isCacheRecordMappers()))
return Cache.run(configuration, new CachedOperation<RecordMapper<R, E>>() {
@Override
public RecordMapper<R, E> call() {
return new DefaultRecordMapper<R, E>(rowType, type, configuration);
}
}, DATA_CACHE_RECORD_MAPPERS, Cache.key(rowType, type));
else
return new DefaultRecordMapper<R, E>(rowType, type, configuration);
} }
} }
3 changes: 3 additions & 0 deletions jOOQ/src/main/java/org/jooq/impl/Fields.java
Expand Up @@ -406,6 +406,9 @@ final void add(Field<?> f) {


@Override @Override
public boolean equals(Object that) { public boolean equals(Object that) {
if (this == that)
return true;

if (that instanceof Fields) if (that instanceof Fields)
return Arrays.equals(fields, ((Fields<?>) that).fields); return Arrays.equals(fields, ((Fields<?>) that).fields);


Expand Down
11 changes: 6 additions & 5 deletions jOOQ/src/main/java/org/jooq/impl/Tools.java
Expand Up @@ -471,6 +471,7 @@ enum DataKey {
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_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_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_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 // Other constants
Expand Down Expand Up @@ -2685,7 +2686,7 @@ static final <V> V run(Configuration configuration, CachedOperation<V> operation
/** /**
* Create a single-value or multi-value key for caching. * 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); return new Key2(key1, key2);
} }


Expand All @@ -2697,11 +2698,11 @@ private static class Key2 implements Serializable {
/** /**
* Generated UID. * Generated UID.
*/ */
private static final long serialVersionUID = 5822370287443922993L; private static final long serialVersionUID = 5822370287443922993L;
private final Serializable key1; private final Object key1;
private final Serializable key2; private final Object key2;


Key2(Serializable key1, Serializable key2) { Key2(Object key1, Object key2) {
this.key1 = key1; this.key1 = key1;
this.key2 = key2; this.key2 = key2;
} }
Expand Down
4 changes: 4 additions & 0 deletions jOOQ/src/main/resources/xsd/jooq-runtime-3.11.0.xsd
Expand Up @@ -115,6 +115,10 @@ UpdatableRecord.store() and UpdatableRecord.update().]]></jxb:javadoc></jxb:prop
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Whether reflection information should be cached in the configuration.]]></jxb:javadoc></jxb:property></appinfo></annotation> <annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Whether reflection information should be cached in the configuration.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element> </element>


<element name="cacheRecordMappers" type="boolean" minOccurs="0" maxOccurs="1" default="true">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Whether record mappers should be cached in the configuration.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>

<element name="throwExceptions" type="jooq-runtime:ThrowExceptions" minOccurs="0" maxOccurs="1" default="THROW_ALL"> <element name="throwExceptions" type="jooq-runtime:ThrowExceptions" minOccurs="0" maxOccurs="1" default="THROW_ALL">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[A strategy defining how exceptions from the database / JDBC driver should be propagated]]></jxb:javadoc></jxb:property></appinfo></annotation> <annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[A strategy defining how exceptions from the database / JDBC driver should be propagated]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element> </element>
Expand Down

0 comments on commit 1d6450a

Please sign in to comment.