This is an automated email from the ASF dual-hosted git repository.
opwvhk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/main by this push:
new 971b0a861 [AVRO-4042] Precache ObjectMapper to avoid recreation (#3123)
971b0a861 is described below
commit 971b0a861f8a2d2aca10b39ca95b4c18d3056539
Author: Andrew <[email protected]>
AuthorDate: Thu Aug 29 07:00:54 2024 +0100
[AVRO-4042] Precache ObjectMapper to avoid recreation (#3123)
ObjectMapper is an expensive, immutable and thread-safe object.
By creating just one instance, we can avoid unnecessary recalculations.
---
.../main/java/org/apache/avro/SchemaBuilder.java | 4 +++-
.../apache/avro/util/internal/JacksonUtils.java | 22 +++++++++++++++-------
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/lang/java/avro/src/main/java/org/apache/avro/SchemaBuilder.java
b/lang/java/avro/src/main/java/org/apache/avro/SchemaBuilder.java
index 818f89aeb..66fa8fbbd 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/SchemaBuilder.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/SchemaBuilder.java
@@ -232,6 +232,8 @@ import com.fasterxml.jackson.databind.node.TextNode;
*/
public class SchemaBuilder {
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
private SchemaBuilder() {
}
@@ -2734,7 +2736,7 @@ public class SchemaBuilder {
} else {
s = GenericData.get().toString(o);
}
- return new ObjectMapper().readTree(s);
+ return MAPPER.readTree(s);
} catch (IOException e) {
throw new SchemaBuilderException(e);
}
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java
b/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java
index 02a3872d4..b0871fad9 100644
---
a/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java
+++
b/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java
@@ -41,6 +41,18 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.util.TokenBuffer;
public class JacksonUtils {
+ /**
+ * Object Mapper used for toJsonNode method.
+ */
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
+ /**
+ * This object mapper uses a special variant that has different visibility
+ * rules, used in objectToMap method.
+ */
+ private static final ObjectMapper OBJECT_TO_MAP_MAPPER = MAPPER.copy()
+ .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
+ .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
private JacksonUtils() {
}
@@ -50,9 +62,9 @@ public class JacksonUtils {
return null;
}
try {
- TokenBuffer generator = new TokenBuffer(new ObjectMapper(), false);
+ TokenBuffer generator = new TokenBuffer(MAPPER, false);
toJson(datum, generator);
- return new ObjectMapper().readTree(generator.asParser());
+ return MAPPER.readTree(generator.asParser());
} catch (IOException e) {
throw new AvroRuntimeException(e);
}
@@ -194,10 +206,6 @@ public class JacksonUtils {
* @return Its Map representation
*/
public static Map objectToMap(Object datum) {
- ObjectMapper mapper = new ObjectMapper();
- // we only care about fields
- mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
- mapper.setVisibility(PropertyAccessor.FIELD,
JsonAutoDetect.Visibility.ANY);
- return mapper.convertValue(datum, Map.class);
+ return OBJECT_TO_MAP_MAPPER.convertValue(datum, Map.class);
}
}