亲身体验 MicroStream:Java 持久性的全新方法

举报
千锋教育 发表于 2023/07/20 16:16:13 2023/07/20
【摘要】 MicroStream 抽象了 Java 持久层,因此您可以以面向对象的方式考虑数据持久性。这里有一个实际操作的介绍。MicroStream 是当前 Java 领域最有趣的项目之一。它采用了一种全新的 Java 持久性方法,充当一种无缝的对象持久性数据层。MicroStream 消除了弄清楚如何持久保存应用程序运行时图的麻烦。我在上一篇文章中介绍了 MicroStream,所以这次我们直接进...

MicroStream 抽象了 Java 持久层,因此您可以以面向对象的方式考虑数据持久性。这里有一个实际操作的介绍。

MicroStream 是当前 Java 领域最有趣的项目之一。它采用了一种全新的 Java 持久性方法,充当一种无缝的对象持久性数据层。MicroStream 消除了弄清楚如何持久保存应用程序运行时图的麻烦。我在上一篇文章中介绍了 MicroStream,所以这次我们直接进行演示。您将首先学习如何将 MicroStream 与默认文件系统一起使用,然后我们将更新演示程序以使用 MariaDB RDBMS。

设置 Java 项目

让我们首先创建一个新的 Java 项目。我们将使用一个简单的 Maven 项目,但任何方法都可以。打开命令行并输入清单 1 中的代码来创建一个具有 Maven 原型的新项目。

清单 1. 创建一个新项目


$ mvn archetype:generate -DgroupId=com.infoworld -DartifactId=microstream -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -Dpackage=com.infoworld -DinteractiveMode=false

请注意,我已将组 ID 设置为com.infoworld,项目 ID 设置为microstream,包设置为com.infoworld


接下来,打开该/myproject/pom.xml文件并添加清单 2 中所示的依赖项。我们将使用 MicroStream 的嵌入式存储库,这是最简单的方法。另外,请确保 Maven 编译器版本设置为 1.8。 

清单 2. Pom.xml 设置


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
<!-- ... -->
<dependency>
    <groupId>one.microstream</groupId>
    <artifactId>microstream-storage-embedded</artifactId>
    <version>07.01.00-MS-GA</version>
</dependency>

现在我们可以运行 MicroStream 入门项目并从命令行获取响应,如清单 3 所示。

清单 3. 运行 MicroStream 启动程序


$ mvn clean package
$ java -cp target/microstream-1.0-SNAPSHOT.jar com.infoworld.App
Hello World!

添加要持久化的模型

接下来,让我们合并一个可以保留的简单模型。我们将更改启动项目的主类以采用三个String命令行参数并将其保存在ArrayList.

清单 4. 带有 ArrayList 模型的 App.java


package com.infoworld;

import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();

    for (int i = 0; i < args.length; i++) {
        list.add(args[i]);
    }

    System.out.println(list);
  }
}

我们可以测试数组列表版本,如清单 5 所示。它接受传入的参数并将它们放入 a 中List,然后输出它。


清单 5. 使用 ArrayList 模型运行 App.java


$ mvn clean package
$ java -cp target/microstream-1.0-SNAPSHOT.jar com.infoworld.App test test2 test3
[test, test2, test3]

使用 MicroStream 存储列表

现在,修改此代码以使用 MicroStream 存储列表。清单 6 显示了它是如何完成的。

清单 6. 保存列表


package com.infoworld;

import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list;
      if (args.length > 0) {
        list = new ArrayList<String>();
        for (int i = 0; i < args.length; i++) {
          list.add(args[i]);
        }
      EmbeddedStorageManager manager = EmbeddedStorage.start();
      manager.setRoot(list);
      manager.storeRoot();
      System.out.println("Saved: " + list);
  }
}

请注意,使用默认值保存状态是多么容易。当我们EmbeddedStorage.start()不带参数调用时,它会创建一个具有默认值的新 MicroStream 引擎,包括默认文件存储位置和持久性策略。

然后我们将根对象设置为我们的列表manager.setRoot()。每个 MicroStream 应用程序都有一个根对象,它是要持久保存的整个对象图的根。

告诉manager.storeRoot()引擎保持该状态。

清单 7 显示了该应用程序的完整版本。请注意,它在传入时会保留列表;如果没有,它会检索并显示它。 

清单 7. 使用默认值保存和恢复对象


import one.microstream.storage.embedded.types.EmbeddedStorage;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;

import java.nio.file.Paths;
import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list;
    if (args.length > 0) {
      list = new ArrayList<String>();
      for (int i = 0; i < args.length; i++) {
        list.add(args[i]);
      }
      EmbeddedStorageManager manager = EmbeddedStorage.start();
      manager.setRoot(list);
      manager.storeRoot();
      System.out.println("Saved: " + list);
    } else {
      EmbeddedStorageManager storageEngine = EmbeddedStorage.start();
      list = (ArrayList<String>) storageEngine.root();
      System.out.println("Loaded: " + list);
    }
    System.exit(0);
  }
}

您会注意到,如果您使用参数运行程序,它将保存字符串列表,如果您不带参数运行程序,它将从存储中提取它们并显示它们。清单 8 有两个选项。

清单 8. 保存并加载程序


$ mvn clean package exec:java -Dexec.mainClass="com.infoworld.App" -Dexec.args="test test2 test3
Saved: [test, test2, test3]
$ mvn clean package exec:java -Dexec.mainClass="com.infoworld.App"
Loaded: [test, test2, test3]

您可能想知道 MicroStream 将存储文件放在哪里。默认情况下,它使用 Java 项目的工作目录。在我们的演示中,它将它放在/microstream/microstream项目的根目录下。如果你看那里,你会看到一个/my-storage-folder.

如果您需要更改存储文件的位置,可以使用 参数进行配置start(),如清单 9 所示。这里,我们在两个 start 调用上设置一个文件位置。请注意,我们导入了标准 Paths Java 库来处理[什么?]。

清单 9. 设置替代目录


import java.nio.file.Paths;
//...
EmbeddedStorageManager manager = EmbeddedStorage.start(Paths.get(System.getProperty("user.home"), "data"));

MicroStream 与 MariaDB

现在让我们看看如何使用替代存储系统。我们将考虑使用本地 MariaDB 社区实例。就我而言(在 Ubuntu 上),我在本地安装了 MariaDB 作为服务(请参阅说明)。一旦 MariaDB 运行,我们就可以修改应用程序以使用数据库来保存状态,如清单 10 所示。

清单 10. 应用程序的 MariaDB 版本


package com.infoworld;

import org.mariadb.jdbc.MariaDbDataSource;
import one.microstream.afs.sql.types.SqlFileSystem;
import one.microstream.afs.sql.types.SqlConnector;
import one.microstream.afs.sql.types.SqlProviderMariaDb;
import one.microstream.storage.embedded.types.EmbeddedStorage;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;
import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    try {
        MariaDbDataSource dataSource = new MariaDbDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUser("admin");
        dataSource.setPassword("password");
        SqlFileSystem fileSystem = SqlFileSystem.New(SqlConnector.Caching(SqlProviderMariaDb.New(dataSource)));

        EmbeddedStorageManager manager = EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));

        ArrayList<String> list;
        if (args.length > 0) {
          list = new ArrayList<String>();
          for (int i = 0; i < args.length; i++) {
            list.add(args[i]);
          }
          manager.setRoot(list);
          manager.storeRoot();
          System.out.println("Saved: " + list);
        } else {
          list = (ArrayList<String>) manager.root();
          System.out.println("Loaded: " + list);
        }
    } catch (Exception e){
      System.err.println("error: "+ e);
      throw new RuntimeException(e);
    }
  }
}

清单 10 具有使用 MariaDB 本地实例而不是默认文件系统的应用程序的完整版本。此版本假设 MariaDB 正在侦听本地主机端口 3306。管理员用户密码是“password”。

注意调用的行EmbeddedStorage.start();它通过了参数fileSystem.ensureDirectoryPath("microstream_storage")。效果是将microstream_storage表添加到mydb数据库(如果尚不存在)。

顺便说一句,这里的错误处理只是一个令牌。在实际应用中,我们需要更加认真地处理错误。

包中的“afs”one.microstream.afs.sql代表抽象文件系统。目的是让应用程序使用MicroStream来保存对象图,而不必过多担心它是如何实现的。因此,数据库、文件系统或云对象存储(例如 AWS S3)都可以按照我们使用 MariaDB 的相同方式使用,除了存储的配置方式不同。NoSQL 与 MongoDB 一样也受支持,尽管它是一项企业功能。

要运行此示例,我们需要将 MariaDB 驱动程序和one.microstream.afsJAR 文件添加到 l 依赖项中pom.xm

清单 11. 添加 MariaDB 依赖项


<dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>2.7.1</version>
    </dependency>
 <dependency>
        <groupId>one.microstream</groupId>
        <artifactId>microstream-afs-sql</artifactId>
        <version>07.01.00-MS-GA</version>
</dependency>

现在,可以使用清单 8 中所示的相同命令来运行该应用程序,并将状态保存到 MariaDB 的本地实例。

结论

MicroStream 处理 Java 持久性的方式与大多数 Java 开发人员习惯的架构方式不同。它消除了安装和维护单独的独立组件来处理数据存储的要求。然而,您已经看到,如果您愿意,您仍然可以使用 RDBMS。

MicroStream 类似于 ORM(如 Hibernate),但更加无缝。它开启了思考对象心理领域内数据持久性的可能性。您仍然需要考虑保存或加载什么以及何时保存或加载,但您不必搁置业务模型并进入数据层作为一个独特的阶段。

MicroStream 采用了一种全新的 Java 持久性方法,这可能是 Java 持续复兴的一个关键特性。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。