当前位置:Java -> Eclipse商店:开始运行

Eclipse商店:开始运行

什么是Eclipse Store?

首先,我想简要解释一下Eclipse Store实际上是什么。简而言之,这是一种用于存储Java对象树的机制。起初听起来非常理论化,但实际上比你想象的要简单得多。

当我在1996年开始开发Java应用程序时,我梦想着能够轻松地存储我在应用程序中创建的对象。我觉得可以使用序列化将所有东西写入硬盘作为字节流的假设非常好。不幸的是,现实看起来与之不同,或者说今天仍然如此。你很快就会面对各种各样的技术,每种技术都有其自己的特点。我依然清楚地记得最初的几步,通过JDBC接口对应用程序的数据进行持久化存储。那时谁不知道JDBC-ODBC接口呢?一个典型的应用现在拥有JDBC连接、映射层在SQL中实现的所有内容,当然还有各种地方的缓存,以便保持应用程序对用户的响应能力可以被容忍。当处理一个更复杂的数据模型时,这并不容易。

通过Eclipse Store,我们现在有了一个可以消除大部分这些技术层的工具。因此,我们终于实现了1996年对我们承诺的东西。

现在让我们来实现我们自己的项目。为此,我们需要maven依赖项。在这个例子中,我使用了第一个正式版本。该版本基于Microstream版本8,并且是Eclipse项目的基础。据我所知,Microstream不再被积极开发。

<dependencies>
	<dependency>
		<groupId>org.eclipse.store</groupId>
		<artifactId>storage-embedded</artifactId>
		<version>{maven-version}</version>
	</dependency>
</dependencies>


现在我们已经将必要的依赖项添加到项目中,我们可以开始编写第一行源代码了。

基本的第一步

存储管理器

我们现在将看一下架构的基本元素。持久化解决方案的关键是"存储管理器"。这是通过它可以配置行为的接口。所有实体也会被传递到持久性中,检索和删除。存储管理器本身以各种形式提供。我们现在将专注于嵌入式存储。这是一个直接访问本地硬盘的内存解决方案。你不应该让名称误导你。和RDBMS系统一样,它不是一个允许你进行一些测试的微小解决方案。嵌入式存储的实现绝对适用于生产。

因此,需要一个这种实现的实例。获取它的最简单的方法是调用:

final EmbeddedStorageManager storageManager = EmbeddedStorage.start();


所选择的实现取决于在pom.xml中定义了哪些依赖项。在我们的例子中,它是嵌入式实现。我们将在接下来的部分讨论其他各种实现。稍后我们也将更详细地看看如何配置行为。这些参数对于第一步来说是无关紧要的,可以放心地忽略。

存储根

存储管理器现在需要知道要存储的图的根。你可以将其想象为以下描述的方式。

如果我们只有一个需要存储的元素,那么就不需要更多的封装。但是,如果我们有两个要保存的部分,我们需要一个容器来保存这两个元素。然后,这个容器就是初始访问所有元素的根。这可以是一个列表或者专门根据您的需求定制的类。现在这个容器必须为持久性做好准备。

让我们来看一个例子。这里应该存储两个不同的字符串。使用列表作为容器。这意味着列表的实例是存储根元素。现在必须将其声明为锚点。

EmbeddedStorageManager storageManager = EmbeddedStorage.start();
            storageManager.setRoot(new ArrayList<>()); 
            storageManager.storeRoot();


`storeRoot()` 指令导致此修改保存在根中。我们将经常看到这个`storeRoot()`方法调用。这会持久保存图中的所有更改,从根开始。在我们的例子中,根本身被保存。

如何向这个容器添加另一个元素呢?不需要保留对这个容器的引用。相反,我们可以向存储管理器询问这个引用。此时不应该忘记什么?如果你覆盖了根,所有先前保存的元素将被删除。这些元素将不再受持久性的监督。

List<String> root = (List<String>) storageManager.root();


在这一点上有点不好的是。不幸的是,`root()` 方法没有类型。在这里,你必须非常清楚容器的类型是什么。我们将会看看如何更好地处理这并具有耐心。

现在可以向此列表添加或删除任意数量的元素。要保存更改,需告知 `StorageManager`。让我们更详细地看看这一点。我们将扩展和修改以前的源代码。现在不再是简单的字符串,而是使用了具有两个属性的单独类。第一个属性再次是字符串并表示数据值。第二个属性是 `LocalDateTime` 类型的实例,是自动设置的时间戳。我们现在就可以看到这已不再是一个简单的属性了。构造函数接管数据值,稍后可以对其进行修改。`timestamp` 不能被显式设置。这里只有一个getter。这样的构造也可以被EclipseStore处理而无需进一步操作。

public class DataElement {
    private String value;
    private LocalDateTime timestamp;
  
    public DataElement(String value) {
        this.value = value;
        this.timestamp = LocalDateTime.now();
    }
    public void setValue(String value) {
        this.value = value;
        this.timestamp = LocalDateTime.now();
    }
    public String getValue() {
        return value;
    }
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
    @Override
    public String toString() {
        return "DataElement{" +
                "value='" + value + '\'' +
                ", timestamp=" + timestamp +
                '}';
    }
  }


情况一:我们向容器添加元素

在我们的情况中,最简单的情况是将一个或多个元素添加到根元素,即 `DataElement` 类型的列表中。通过向列表中添加预期的元素,并在根级别调用 `storeRoot()` 方法或自己保存元素来实现。

EmbeddedStorageManager storageManager = EmbeddedStorage.start();
        storageManager.setRoot(new ArrayList<DataElement>());
        storageManager.storeRoot();
        List<DataElement> root = (List<DataElement>) storageManager.root();
        root.add(new DataElement("Nr 1"));
        root.add(new DataElement("Nr 2"));
        storageManager.storeRoot();


以下是定义元素的方法。

DataElement d3 = new DataElement("Nr 3");
DataElement d4 = new DataElement("Nr 4");
root.add(d3);
root.add(d4);
storageManager.storeAll(d3, d4);


情况二:我们从容器中移除元素

添加元素的反向操作是删除它们。这里,过程也非常直接。然而,一开始看到不同的选择可能会有些不寻常。首先,最直观的版本是将元素从持有对象即根本身中移除。然后将这个被减少了的实例传递给StorageManager,请求保存这个修改。

root.remove(d3);
storageManager.store(root);


然而,你也可以自己使用被移除的元素。为此,先前从持有实例中移除的元素被传递给StorageManager进行存储。这种方法可行,但绝非直观。出于可理解性的考虑,在这一点上你不应该这样做。你的同事会对此感激不尽。

root.remove(d4);
storageManager.store(d4);


情况三:我们修改容器中的元素

由于现在可以添加和移除元素,唯一缺少的是修改。在这里,过程与添加类似。修改实例后,将其传递给StorageManager进行存储。存储过程当然也可以通过持有元素进行,但出于可读性考虑,强烈建议自己保存修改过的元素。当然,例外情况是在一个持有实例内更改了很多元素时。

d3.setValue("Nr 3. modified");
storageManager.store(d3);


总结

现在我们已经看到使用EclipseStore有多么简单。元素现在可以被保存而不需要额外的努力。通过这种方式,你可以实现第一个小型应用程序。但这还不是结束。接下来的部分将解决更复杂应用程序的复杂性和挑战。所以这仍然是一个扣人心弦的过程。

编码愉快

Sven 

推荐阅读: 百度面经(23)

本文链接: Eclipse商店:开始运行