共计 6063 个字符,预计需要花费 16 分钟才能阅读完成。
原题目: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 的导入时。