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);
   }
 }

Reply via email to