You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut EclipseStore应用重启后数据丢失问题求助

Micronaut EclipseStore重启后数据丢失问题排查与解决

问题场景

使用Micronaut EclipseStore作为存储组件时,出现以下情况:

  • 成功添加DependencyDTO后,调用list()能正常返回数据
  • 重启应用后,list()返回空结果

配置与代码参考

application.yml配置

eclipsestore:
  storage:
    versions:
      root-class: my.package.name/domain/DependencyContainer
      storage-directory: dependency-storage
      channel-count: 1

数据操作核心代码

private final RootProvider<DependencyContainer> rootProvider;

public DependencyRepositoryImpl(RootProvider<DependencyContainer> rootProvider) {
    this.rootProvider = rootProvider;
}

@Override
public Collection<Dependency> list(){return rootProvider.root().getDependencyMap().values();}

@Override
public Dependency create(DependencyDTO dependencyDTO) throws DependencyDuplicateException {
    Map<String, Dependency> dependencyMap = rootProvider.root().getDependencyMap();
    return performCreate(dependencyMap, dependencyDTO);
}

@StoreParams("versions")
protected Dependency performCreate(Map<String, Dependency> dependencyMap, DependencyDTO dependencyDTO) {
    Dependency newDependency = new Dependency(dependencyDTO.getDependencyName(),
            dependencyDTO.getGithubPath()
    );
    dependencyMap.put(dependencyDTO.getDependencyName(), newDependency);
    return newDependency;
}

排查与解决步骤

1. 修正根类配置格式

你的root-class用了斜杠分隔路径,Micronaut EclipseStore要求使用全限定类名(点分隔),这会导致无法识别根类,无法持久化数据。
修正后的配置:

eclipsestore:
  storage:
    versions:
      root-class: my.package.name.domain.DependencyContainer
      storage-directory: dependency-storage
      channel-count: 1

2. 显式触发持久化操作

EclipseStore默认不会自动将内存修改写入磁盘,即使加了@StoreParams注解,也建议显式调用持久化方法确保数据落地。修改performCreate方法:

@StoreParams("versions")
protected Dependency performCreate(Map<String, Dependency> dependencyMap, DependencyDTO dependencyDTO) {
    Dependency newDependency = new Dependency(dependencyDTO.getDependencyName(),
            dependencyDTO.getGithubPath()
    );
    dependencyMap.put(dependencyDTO.getDependencyName(), newDependency);
    // 强制触发持久化
    rootProvider.root().store();
    return newDependency;
}

3. 检查存储目录权限与存在性

确认应用启动路径下的dependency-storage目录是否存在、是否有读写权限:

  • 如果目录不存在,手动创建并赋予应用读写权限
  • 也可以配置绝对路径避免路径问题,比如storage-directory: /opt/app/dependency-storage

4. 确保实体类可序列化

EclipseStore要求持久化的类必须支持序列化,给DependencyContainer和Dependency添加Serializable实现:

public class DependencyContainer implements Serializable {
    private Map<String, Dependency> dependencyMap = new HashMap<>();
    // getter/setter
}

public class Dependency implements Serializable {
    private String dependencyName;
    private String githubPath;
    // 构造方法、getter/setter
}

5. 验证持久化效果

添加数据后,查看dependency-storage目录下的.eclipsestore相关文件是否有大小变化,若有变化说明持久化成功;若无变化,回到前面步骤重新排查。


内容的提问来源于stack exchange,提问作者Yun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:01