MicroStream的介绍:Java中的超高速序列化
MicroStream是一个现代的Java对象图持久化层,它通过一个非常出色的序列化方法实现了高性能,让我们来看看。
MicroStream是一种非常有趣的,甚至是大胆的Java应用程序中的数据持久化方法。它建议完全避开服务器-数据存储的复杂性,而是提供一个运行在应用程序内部的对象持久化层。甲骨文公司已经将MicroStream纳入其Helidon微服务框架,这可以看作是对该方法的一个重要认可。
继续阅读以了解更多关于MicroStream及其开源对象图形持久化层的信息。
重新考虑Java的序列化问题
在某种意义上,你可以把MicroStream看作是对序列化思想的一次从头开始的重做。
传统的Java序列化有几个讨厌的限制(包括安全漏洞),促使Oracle在2018年称其为"可怕的错误"。但是内在的想法,即能够在运行时简单地存储和检索对象图,仍然是一个可行的想法。
现在需要的是一个非常出色的实现。这就是MicroStream的作用。
MicroStream的缓存实现
MicroStream也实现了JSR-107(JCache规范)。这意味着你可以使用MicroStream作为你的缓存层(例如使用Hibernate/JPA),也可以不启用MicroStream的持久性和存储部分。
这使得使用MicroStream作为一站式的缓存和持久化解决方案很有诱惑力,尤其是在微服务的背景下。
MicroStream序列化的改进
也许MicroStream对传统序列化最重要的改进是能够只持久化对象图的一部分。没有这一点,任何解决方案都无法处理现实世界应用的需求。
MicroStream还通过自动建模或开发者定义的配置来处理不断变化的类结构(所有应用程序中的现实)。
另外,MicroStream能够处理所有可持续的Java结构,与传统的序列化不同。
MicroStream的数据根
在MicroStream中,将由持久化引擎管理的对象图从一个被称为DataRoot 的根节点开始。
DataRoot 对象可以是任何类型的,它被设置在StorageManager 实例上,如清单 1 所示。请注意,每当存储管理程序启动时,它都会自动从上一个持久化会话中对图进行补水,这发生在storeRoot() 的调用中。
清单1.启动存储管理器并指定一个根
public class MyDataRoot {
在清单1中,该类有一个成员,它可以是任何对象。在一个真实世界的应用程序中,你可能会建立一个商业模型。你可以使用一个map作为你的数据模型,并将所有东西都存储为键值对。MicroStream可以处理你扔给它的任何东西,而且它足够灵活,可以随着你不断变化的类结构而发展。
定义一个文件路径
StorageManager 有几个配置选项。其中最重要的一个是数据存储位置的路径。你可以在清单2中看到这个动作。
清单2.设置数据存储的路径
final MyDataRoot myRoot = new MyDataRoot();
你可以用storageManager.shutdown(); ,优雅地关闭引擎。
MicroStream中的多线程
在多线程的应用程序代码中,突变和持久化的数据必须是同步的。如清单3所示,Microstream为这一目的提供了一个Lambda。
清单3.同步访问
XThreads.executeSynchronized(() -> { root.changeData(); storageManager.store(root); });
MicroStream的配置
MicroStream有各种配置选项,你可以通过声明或编程的方式来设置。
例如,你可以配置NIO(非阻塞性IO)文件系统,它是文件管理器内读/写操作的基础,如清单4所示。这个例子取自MicroStream的文档。
清单4.配置NIO文件系统
NioFileSystem fileSystem = NioFileSystem.New();
你也可以从JSON、YAML和XML加载外部配置。
在MicroStream中进行查询
MicroStream方法的一个有趣结果是不需要专门的查询语言,如SQL或HQL或标准API。你可以简单地使用标准的Java来浏览你的运行时图并挑选结果。你可以使用老式的循环或功能式的Stream API来行走关联,并测试你所寻求的属性。MicroStream给出的例子在清单5中,但任何典型的方法都可以使用。
清单5.在图中寻找一个对象
public List
结果是,因为你的数据层存储的是普通的Java对象,你可以使用普通的Java进行查询。
MicroStream存储选项
虽然默认的是文件系统,但MicroStream是一个抽象层,能够与其他持久性解决方案一起工作。它甚至可以通过连接器对关系数据库管理系统(如MariaDB)运行。清单6让你看一下这个。
清单6.使用MariaDB RDBMS连接器
MariaDbDataSource dataSource = new MariaDbDataSource();
这是一个相当强大的能力,从Java对象到数据库,再到无缝返回,特别是与使用Hibernate这样的对象关系映射器(ORM)的工作相比。
对于使用非关系型数据存储如Redis和MongoDB,以及云数据存储如Amazon S3和Oracle云存储,也有类似的支持。
MicroStream的存储模式
MicroStream支持两种存储模式:懒惰和急切。默认情况下,MicroStream使用懒惰存储。
在懒惰存储中,一旦一个对象被持久化,它将不会被再次存储,即使被修改。要持久化一个被修改的对象,你必须明确地调用存储它。这有一个明显的性能优势,即避免与底层存储系统的交互,除非开发者要求这样做。
在急迫存储中,MicroStream会在持久化实例发生变化时自动更新它们。你可以在清单7中看到如何启用急切存储。
清单7.急切存储器
Storer storer = storage.createEagerStorer(); storer.store(myData); storer.commit();
瞬时字段修改器
MicroStream透明地实现了瞬时修改器,这样的成员将不会被引擎持久化。这使得选择不存储的方式变得简单。
MicroStream的性能
MicroStream的主要开发者在这里对该框架的性能影响做了简明的描述。这是一个简短而值得一读的文章。它解释了系统是如何在不失去参考完整性的情况下,通过读取一次类的布局元数据,然后监测它的变化,从而达到一流的性能。它还会帮助你理解MicroStream是如何减轻反射的限制的。
MicroStream的另一个有趣的方面是它如何跟踪那些已经从图形中分离出来的实体(即已经被垃圾收集),因此需要从存储中切除。这在MicroStream中被称为内务管理,是一项令人印象深刻的技术成就。