亲身体验 MicroStream:Java 持久性的全新方法
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.afs
JAR 文件添加到 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 持续复兴的一个关键特性。
- 点赞
- 收藏
- 关注作者
评论(0)