1

我正在使用 Gemfire 开发一些应用程序,如果能够在开发环境中提供一些虚假数据,那就太好了。

因此,我没有像今天那样在代码中执行此操作,而是考虑使用 spring application-context.xml 在我当前正在处理的区域中预加载一些虚拟数据。类似于 DBUnit 所做的事情,但对于 DEV 而不是测试范围。后来我可以在 Spring 上切换 envs 并且不会加载数据。

是否可以使用 SpringData Gemfire 将数据添加到本地数据网格?

谢谢!

4

1 回答 1

2

Spring Data GemFire 中没有直接支持将数据加载到 GemFire 集群中。但是,SDG/GemFire 开发人员可以通过多种方式加载数据。

  1. 最常见的方法是定义一个附加到 Region的 GemFire CacheLoader 。但是,这种方法是“惰性的”,并且仅在缓存未命中时从(可能的)外部数据源加载数据。当然,您可以对 CacheLoader 中的逻辑进行编程,以基于数据访问模式以某种“预测”方式“预取”多个条目。有关详细信息,请参阅 GemFire 的用户指南。

尽管如此,我们可以做得比这更好,因为您更有可能希望“预加载”特定数据集以用于开发目的。

  1. 另一种更有效的技术是使用在 Spring ApplicationContext 中注册的 Spring BeanPostProcessor,它在初始化后对“Region”bean 进行后期处理。例如...

RegionPutAllBeanPostProcessor 被实现为......

package example;

public class RegionPutAllBeanPostProcessor implements BeanPostProcessor {

  private Map regionData;

  private String targetRegionBeanName;

  protected Map getRegionData() {
    return (regionData != null ? regionData : Collections.emptyMap());
  }

  public void setRegionData(final Map regionData) {
    this.regionData = regionData;
  }

  protected String getTargetRegionBeanName() {
    Assert.state(StringUtils.hasText(targetRegionBeanName), "The target Region bean name was not properly specified!");
    return targetBeanName;
  }

  public void setTargetRegionBeanName(final String targetRegionBeanName) {
    Assert.hasText(targetRegionBeanName, "The target Region bean name must be specified!");
    this.targetRegionBeanName = targetRegionBeanName;
  }

  @Override
  public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {
    return bean;
  }

  @Override
  @SuppressWarnings("unchecked")
  public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
    if (beanName.equals(getTargetRegionBeanName()) && bean instanceof Region) {
      ((Region) bean).putAll(getRegionData());
    }

    return bean;
  }
}

不难想象您可以注入某种类型的 DataSource 来预填充 Region。RegionPutAllBeanPostProcessor 旨在接受特定区域(基于区域 bean ID)来填充。因此,您可以定义多个实例,每个实例采用不同的区域和不同的数据源(可能)来填充选择的区域。这个 BeanPostProcess 只是将一个 Map 作为数据源,当然,它可以是任何 Spring 托管的 bean。

最后,通过利用 Spring bean 配置文件确保仅在您的 DEV 环境中使用 RegionPutAllBeanPostProcessor 的这个或多个实例是一件简单的事情......

<beans>
  ...

  <beans profile="DEV">
    <bean class="example.RegionPutAllBeanPostProcessor">
      ...
    </bean>
    ...
  </beans>
</beans>

通常,就预定义数据的“来源”而言,加载预定义数据集是非常特定于应用程序的。正如我的示例所示,源可以像另一个 Map 一样简单。但是,它可能是一个 JDBC 数据源,或者可能是一个属性文件,或者其他任何与此相关的东西。这通常取决于开发人员的偏好。

不过,添加到 Spring Data GemFire 中可能有用的一件事是从 GemFire 缓存区域快照加载数据。即可能已经从 QA 或 UAT 环境中转储的数据,或者甚至可能出于测试目的从 PROD 中清除的数据。有关详细信息,请参阅 GemFire快照服务。

另请参阅我刚刚提交以添加此支持的 JIRA 票证 ( SGF-408 )。

希望这可以为您提供足够的信息和/或想法。稍后,我将在 SDG 的 XML 命名空间中添加一流的支持,用于预加载数据集。

问候,约翰

于 2015-06-07T20:37:37.060 回答