【问题标题】:Avro serialization: which parts are and aren't thread-safe?Avro 序列化:哪些部分是线程安全的,哪些不是线程安全的?
【发布时间】:2017-05-03 12:55:34
【问题描述】:

我在网上的不同地方看到了一些相互矛盾的信息,因此希望得到真正知道的人的权威回答。

假设,我正在将一些东西序列化到 avro:

    class StuffToAvro {
       private final Schema schema;
       StuffToAvro(Schema schema) { this.schema = schema }

       void apply(GenericRecord stuff, OutputStream out) {
         final Encoder encoder = EncoderFactory.get.binaryEncoder(out, null);
         final GenericDatumWriter writer = new GenericDatumWriter(schema);
         writer.write(stuff, encoder):
       }
    }

问题是我是否可以/应该通过重用编码器和写入器来优化它,如果可以,正确的方法是什么:我可以预先初始化写入器并使其成为final 例如,还是必须是ThreadLocal

关于编码器的类似问题:我应该记住前一个实例并将其传递给getBinaryEncoder 以重复使用,还是也需要ThreadLocal

在每种情况下,如果答案是ThreadLocal,我还想知道这种优化是否值得复杂:每次创建一个全新的编写器和/或编码器而不是重复使用它们实际上是否昂贵?

另外,我认为,无论我在这里得到什么答案,也适用于阅读/解码。对吗?

欣赏任何指针。

谢谢!

【问题讨论】:

    标签: java multithreading serialization avro


    【解决方案1】:

    根据这个post

    是的,一个 DatumReader 实例可以在多个线程中使用。编码器 和 Decoder 不是线程安全的,但 DatumReader 和 DatumWriter 是。

    编写器也是线程安全的。

    是的,重新使用单个 GenericDatumWriter 写入多个对象 应该提高性能。

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2011-08-28
      • 2010-12-20
      • 2023-03-22
      • 2011-01-11
      • 2012-04-18
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多