原题目:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程七(Spring中国教育管理中心)

5.6.2.IgnoreIfExists和Override
Apache GeodeIndex配置选项的两个 Spring Data值得特地提及:ignoreIfExists和override.

这些选项别离对应于 Spring Data for Apache Geode 的 XML 命名空间中元素上的ignore-if-exists和override属性<gfe:index>。

在应用这些选项中的任何一个之前,请确保您齐全理解本人在做什么。这些选项会影响应用程序在运行时耗费的性能和资源(例如内存)。因而,false默认状况下,这两个选项在 SDG 中都被禁用(设置为)。

这些选项仅在 Spring Data for Apache Geode 中可用,并且存在以解决 Apache Geode 的已知限度。Apache Geode 没有等效的选项或性能。

每个选项在行为上都存在显着差别,并且齐全取决于Index抛出的 Apache Geode异样的类型。这也意味着如果没有抛出 Apache Geode Index 类型的异样,这两个选项都没有任何影响。这些选项旨在专门解决 Apache GeodeIndexExistsException和
IndexNameConflictException 实例,这可能出于各种起因,有时是含糊的起因。出现异常的起因如下:

一个IndexExistsException 当存在另一个被抛出Index具备雷同的定义,但试图创立一个时,不同的名称Index。
一个IndexNameConflictException 当存在另一个被抛出Index试图创立一个在用雷同的名字,但有可能不同的定义Index。
Spring Data for Apache Geode 的默认行为总是疾速失败。因而,默认状况下不会“解决”这两个Index 异样。这些Index异样被包装在一个 SDG 中GemfireIndexException并被从新抛出。如果您心愿 Spring Data for Apache Geode 为您解决它们,您能够将这些Indexbean 定义选项中的任何一个设置为true.

IgnoreIfExists总是优先于Override,次要是因为它应用较少的资源,仅仅因为它Index在两种例外情况下都返回“现有” 。

IgnoreIfExists行为
当 anIndexExistsException被抛出并被ignoreIfExists设置为true(or <gfe:index ignore-if-exists="true">) 时,那么Index将由这个indexbean 定义或申明创立的被简略地疏忽,并Index返回现有的。

返回现有的 没有什么影响Index,因为indexbean 定义是雷同的,由 Apache Geode 自身决定,而不是 SDG。

然而,这也意味着从 Apache Geode 的角度来看Index,您的indexbean 定义或申明中指定的“名称”实际上不存在(即 with QueryService.getIndexes())。因而,在编写应用查问提醒的 OQL 查问语句时应该小心,尤其是援用Index被疏忽的应用程序的查问提醒。这些查问提醒须要更改。


anIndexNameConflictException被抛出并被ignoreIfExists设置为true(or <gfe:index ignore-if-exists="true">) 时,Index由这个indexbean 定义或申明创立的也被疏忽,并且“现有”Index再次返回,就像当 anIndexExistsException被抛出时一样。

然而,返回现有的Index并疏忽应用程序对抛出Index an 时的定义存在更大的危险
IndexNameConflictException。对于 a IndexNameConflictException,尽管抵触索引的名称雷同,但定义可能不同。这种状况可能会对特定于应用程序的 OQL 查问产生影响,在这种状况下,您会假如索引是专门依据应用程序数据拜访模式和查问定义的。然而,如果同名索引的定义不同,则状况可能并非如此。因而,您应该验证您的Index姓名。

当Index被疏忽的定义与现有定义显著不同时,SDG 会尽最大致力告诉用户Index。然而,为了让 SDG 实现这一点,它必须可能找到现有的Index,这是通过应用 Apache Geode API(惟一可用的办法)查找的。

Override行为
当 anIndexExistsException被抛出并被override设置为true(或<gfe:index override="true">) 时, theIndex被无效地重命名。请记住,IndexExistsExceptions当存在多个具备雷同定义但名称不同的索引时抛出。

Spring Data for Apache Geode 只能通过应用 Apache Geode 的 API 来实现这一点,首先删除现有的Index ,而后Index应用新名称从新创立。remove 或后续的 create 调用可能会失败。如果任何一个操作失败,都无奈原子地执行这两个操作并回滚此联合操作。

然而,如果它胜利,那么您将遇到与以前雷同的ignoreIfExists选项问题。任何应用Index按名称援用旧的查问提醒的现有 OQL 查问语句都必须更改。


anIndexNameConflictException被抛出并被override设置为true(or <gfe:index override="true">) 时,现有的Index可能会被从新定义。咱们说“潜在”是因为Index当IndexNameConflictException抛出an 时,同名的存在可能具备完全相同的定义和名称。

如果是这样,SDG 是智能的,并按Index原样返回现有,即便在override. 这种行为没有坏处,因为名称和定义完全相同。当然,SDG 只能在 SDG 可能找到现有 的状况下能力实现Index,这依赖于 Apache Geode 的 API。如果找不到,则什么也不会产生,并且GemfireIndexException会抛出一个 SDG包装
IndexNameConflictException.

然而,当存在的定义Index不同时,SDG 尝试Index 应用bean 定义中Index指定的定义从新创立index。确保这是您想要的,并确保indexbean 定义合乎您的冀望和应用程序要求。

IndexNameConflictExceptions理论状况如何?
IndexExistsExceptions抛出这种状况可能并不常见,尤其是当应用多个配置源来配置 Apache Geode(用于 Apache Geode 的 Spring Data、Apache Geode Cluster Config、Apache Geode native cache.xml、API 等)时。您相对应该更喜爱一种配置办法并保持应用它。

然而,什么时候
IndexNameConflictException会抛出一个get 呢?

一种非凡状况是Index在PARTITION区域 (PR)上定义。当Index在PARTITION区域(例如X)上Index定义 时,Apache Geode 会将定义(和名称)分发给集群中也托管雷同PARTITION区域(即“X”)的其余对等成员。对等成员散发此Index定义并随后创立此定义Index是在须要晓得的根底上(即由托管同一 PR 的对等成员)异步执行的。

在这段时间里,IndexesApache Geode 可能无奈辨认这些待处理的PR——例如调用QueryService.getIndexes() with QueryService.getIndexes(:Region),甚至调用QueryService.getIndex(:Region, indexName:String)。

因而,SDG 或其余 Apache Geode 缓存客户端应用程序(不波及 Spring)确定晓得的惟一办法是尝试创立Index. 如果它因
anIndexNameConflictException或什至 an失败IndexExistsException,则应用程序晓得存在问题。这是因为QueryService Index创立会期待挂起的Index定义,而其余 Apache Geode API 调用则不会。

在任何状况下,SDG 都会尽最大致力并尝试告诉您曾经产生或正在产生的事件,并告诉您纠正措施。鉴于所有 Apache
GeodeQueryService.createIndex(..)办法都是同步的、阻塞的操作,因而在抛出这些索引类型异样中的任何一个后,Apache Geode 的状态应该是统一且可拜访的。因而,SDG 能够查看零碎状态并依据您的配置采取相应措施。

在所有其余状况下,SDG 采纳疾速失败策略。

5.7.配置磁盘存储
Spring Data for Apache Geode 反对DiskStore通过disk-store元素进行配置和创立,如下例所示:

<gfe:disk-store id="Example" auto-compact="true" max-oplog-size="10"

            queue-size="50" time-interval="9999"><gfe:disk-dir location="/disk/location/one" max-size="20"/><gfe:disk-dir location="/disk/location/two" max-size="20"/>

</gfe:disk-store>
DiskStore实例被区域用于文件系统长久备份和被驱赶条目标溢出以及 WAN 网关的长久备份。多个 Apache Geode 组件可能共享雷同的DiskStore. 此外,能够为单个 定义多个文件系统目录DiskStore,如后面的示例所示。

无关实例的持久性和溢出 以及配置选项的残缺阐明,请参阅 Apache Geode 的文档 DiskStore。

5.8.配置快照服务
Spring Data for Apache Geode 通过应用Apache Geode 的 Snapshot Service反对缓存和区域快照 。开箱即用的快照服务反对提供了几个不便的性能来简化 Apache Geode 的 缓存 和区域 快照服务 API 的应用。

正如Apache Geode 文档所解释的那样,快照容许您保留并随后从新加载缓存的数据,这对于在环境之间挪动数据十分有用,例如从生产环境到暂存或测试环境,以便在受控环境中重现与数据相干的问题。语境。您能够将 Spring Data for Apache Geode 的 Snapshot Service 反对与Spring 的 bean 定义配置文件相结合 ,以依据须要加载特定于环境的快照数据。

Spring Data for Apache Geode 对 Apache Geode 的快照服务的反对始于XML 命名空间中的<gfe-data:snapshot-service>元素<gfe-data>。

例如,您能够应用几个快照导入和数据导出定义来定义要加载和保留的缓存范畴快照,如下所示:

<gfe-data:snapshot-service id="gemfireCacheSnapshotService">
<gfe-data:snapshot-import location="/absolute/filesystem/path/to/import/fileOne.snapshot"/>
<gfe-data:snapshot-import location="relative/filesystem/path/to/import/fileTwo.snapshot"/>
<gfe-data:snapshot-export

  location="/absolute/or/relative/filesystem/path/to/export/directory"/>

</gfe-data:snapshot-service>
您能够依据须要定义任意数量的导入和导出。您能够仅定义导入或仅定义导出。文件地位和目录门路能够是相对的,也能够是绝对于 Spring Data for Apache Geode 应用程序的,它是 JVM 过程的工作目录。

后面的示例非常简单,在这种状况下定义的快照服务指的是默认名称为gemfireCache(如配置缓存中所述)的 Apache Geode 缓存实例。如果您将缓存 bean 定义命名为默认值以外的其余名称,则能够应用该cache-ref属性按名称援用缓存 bean,如下所示:

<gfe:cache id="myCache"/>
...
<gfe-data:snapshot-service id="mySnapshotService" cache-ref="myCache">
...
</gfe-data:snapshot-service>
您还能够通过指定region-ref属性为特定区域定义快照服务,如下所示:

<gfe:partitioned-region id="Example" persistent="false" .../>
...
<gfe-data:snapshot-service id="gemfireCacheRegionSnapshotService" region-ref="Example">
<gfe-data:snapshot-import location="relative/path/to/import/example.snapshot/>
<gfe-data:snapshot-export location="/absolute/path/to/export/example.snapshot/>
</gfe-data:snapshot-service>
当region-ref属性指定的,秋季数据为Apache的Geode的
SnapshotServiceFactoryBean解析region-ref 属性值在Spring容器中定义的地区豆和创立 RegionSnapshotService。快照导入和导出定义的性能雷同。然而,location必须援用导出中的文件。

Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程七
Apache Geode 严格要求在援用之前理论存在的导入快照文件。对于导出,Apache Geode 创立快照文件。如果导出的快照文件已存在,则数据将被笼罩。

Spring Data for Apache
Geodesuppress-import-on-init在<gfe-data:snapshot-service>元素上蕴含一个属性,用于禁止配置的快照服务在初始化时尝试将数据导入缓存或区域。这样做很有用,例如,当从一个 Region 导出的数据用于馈送另一个 Region 的导入时。