原题目:Spring 认证中国教育管理中心 -Apache Geode 的 Spring 数据教程十一(Spring 中国教育管理中心)
6.8. 配置日志
通常,为了精确理解 Apache Geode 正在做什么以及何时执行,有必要关上日志记录。
要启用日志记录,请应用 @EnableLogging 并设置适当的属性或关联属性来正文您的应用程序类,如下所示:
ClientCache 启用日志记录的 Spring 应用程序
@SpringBootApplication
@ClientCacheApplication
@EnableLogging(logLevel=”info”, logFile=”/absolute/file/system/path/to/application.log)
public class ClientApplication {..}
尽管 logLevel 能够应用所有基于缓存的应用程序正文(例如,@ClientCacheApplication(logLevel=”info”))指定该属性,但应用 @EnableLogging 正文自定义日志记录行为更容易。
此外,您能够 log-level 通过
spring.data.gemfire.logging.level 在 application.properties.
无关 更多详细信息,请参阅 @EnableLogging 正文 Javadoc。
6.9. 配置统计
要在运行时更深刻地理解 Apache Geode,您能够启用统计信息。收集统计数据有助于系统分析和故障排除,当简单问题产生时,这些问题通常在自然界中散布且工夫是一个关键因素。
启用统计后,您能够应用 Apache Geode 的 VSD(可视统计显示)工具来剖析收集的统计数据。
要启用统计信息,请应用 正文您的应用程序类 @EnableStatistics,如下所示:
ClientCache 启用统计的 Spring 应用程序
@SpringBootApplication
@ClientCacheApplication
@EnableStatistics
public class ClientApplication {..}
在评估性能时,在服务器上启用统计信息特地有价值。要做到这一点,你的正文 @PeerCacheApplication 或 @CacheServerApplication 类 @EnableStatistics。
您能够应用 @EnableStatistics 正文属性或关联属性来自定义统计信息收集和收集过程。
无关 更多详细信息,请参阅 @EnableStatistics 正文 Javadoc。
能够在此处找到无关 Apache Geode 统计数据的更多详细信息。
6.10. 配置 PDX
Apache Geode 更弱小的性能之一是 PDX 序列化。尽管对 PDX 的残缺探讨超出了本文档的范畴,但应用 PDX 进行序列化是 Java 序列化的更好代替办法,具备以下长处:
PDX 应用集中式类型注册表来放弃对象的序列化字节更紧凑。
PDX 是一种中性的序列化格局,容许 Java 和 Native 客户端对同一数据集进行操作。
PDX 反对版本控制并容许增加或删除对象字段,而不会影响应用已更改的旧版或新版 PDX 序列化对象的现有应用程序,而不会失落数据。
PDX 容许在 OQL 查问投影和谓词中独自拜访对象字段,而无需先对对象进行反序列化。
通常,在失常散发和复制过程中,以及在数据溢出或长久化到磁盘时,任何时候都须要在 Apache Geode 中进行序列化。
启用 PDX 序列化比批改要实现的所有应用程序域对象类型要简略得多 java.io.Serializable,尤其是在对应用程序域模型施加此类限度可能不合须要时,或者您对正在序列化的对象没有任何控制权时,尤其如此应用 3rd 方库时为 true(例如,思考带有 Coordinate 类型的天文空间 API)。
要启用 PDX,请应用 正文您的应用程序类 @EnablePdx,如下所示:
ClientCache 启用 PDX 的 Spring 应用程序
@SpringBootApplication
@ClientCacheApplication
@EnablePdx
public class ClientApplication {..}
通常,应用程序的域对象类型要么实现该
org.apache.geode.pdx.PdxSerializable 接口,要么您能够实现并注册该 接口的非侵入式实现,org.apache.geode.pdx.PdxSerializer 以解决所有须要序列化的应用程序域对象类型。
可怜的是,Apache Geode 只容许 PdxSerializer 注册一个,这表明所有应用程序域对象类型都须要由单个 PdxSerializer 实例解决。然而,这是一种重大的反模式和不可保护的做法。
只管只能 PdxSerializer 向 Apache Geode 注册一个实例,但为 PdxSerializer 每个应用程序域对象类型创立一个实现是有意义的。
通过应用复合软件设计模式,您能够提供 PdxSerializer 接口的实现,该接口聚合所有应用程序域对象类型特定的 PdxSerializer 实例,但充当单个 PdxSerializer 实例并注册它。
您能够 PdxSerializer 在 Spring 容器中将此组合申明为托管 bean,并应用属性 PdxSerializer 在 @EnablePdx 正文中通过其 bean 名称援用此组合 serializerBeanName。Spring Data for Apache Geode 负责代表您将其注册到 Apache Geode。
以下示例显示了如何创立自定义组合 PdxSerializer:
ClientCache 启用 PDX 的 Spring 应用程序,应用自定义组合 PdxSerializer
@SpringBootApplication
@ClientCacheApplication
@EnablePdx(serializerBeanName = “compositePdxSerializer”)
public class ClientApplication {
@Bean
PdxSerializer compositePdxSerializer() {
return new CompositePdxSerializerBuilder()...
}
}
也能够
org.apache.geode.pdx.ReflectionBasedAutoSerializer 在 Spring 上下文中将 Apache Geode 申明 为 bean 定义。
或者,您应该将 Spring Data 用于 Apache Geode 的更弱小的
org.springframework.data.gemfire.mapping.MappingPdxSerializer,它应用 Spring Data 映射元数据和利用于序列化过程的基础设施,以便比独自的反射更无效地解决。
PDX 的许多其余方面和个性能够通过 @EnablePdx 正文属性或相干的配置属性进行调整。
无关 更多详细信息,请参阅 @EnablePdx 正文 Javadoc。
6.11. 配置 Apache Geode 属性
尽管许多 gemfire.properties 被不便地封装在基于 SDG 正文的配置模型中的正文中并形象进去,但依然能够从 @EnableGemFireProperties 正文中拜访不太罕用的 Apache Geode 属性。
在启动应用程序时,应用 正文应用程序类 @EnableGemFireProperties 很不便,并且是 gemfire.properties 在命令行上创立文件或将 Apache Geode 属性设置为 Java 零碎属性的一种很好的代替办法。
咱们倡议 gemfire.properties 在将应用程序部署到生产环境时在文件中设置这些 Apache Geode 属性。然而,在开发时,为了原型设计、调试和测试目标,依据须要独自设置这些属性会很不便。
一些不常见的 Apache 的 Geode 性能的几个例子,你通常不用放心包含但不限于:ack-wait-threshold,disable-tcp,socket-buffer-size,和其他人。
要独自设置任何 Apache Geode 属性,请应用相应的属性正文您的应用程序类,@EnableGemFireProperties 并设置要更改的 Apache Geode 属性,从 Apache Geode 设置的默认值开始,如下所示:
ClientCache 具备特定 Apache Geode 属性集的 Spring 应用程序
@SpringBootApplication
@ClientCacheApplication
@EnableGemFireProperties(conflateEvents = true, socketBufferSize = 16384)
public class ClientApplication {..}
请记住,一些在 Apache 的 Geode 属性是客户特定的(例如,conflateEvents),而另一些服务器特定的(例如 distributedSystemId,
enableNetworkPartitionDetection,enforceUniqueHost,memberTimeout,redundancyZone,等)。
能够在此处找到无关 Apache Geode 属性的更多详细信息。
6.12. 配置区域
到目前为止,在 PDX 之外,咱们的探讨集中在配置 Apache Geode 的更多治理性能:创立缓存实例、启动嵌入式服务、启用日志记录和统计、配置 PDX 以及 gemfire.properties 用于影响低级配置和行为。只管所有这些配置选项都很重要,但它们都与您的应用程序没有间接关系。换句话说,咱们依然须要一些中央来存储咱们的应用程序数据并使其广泛可用和可拜访。
Apache Geode 将缓存中的数据组织到 Regions 中。您能够将区域视为关系数据库中的表。一般来说,一个 Region 应该只存储一种类型的对象,这样更有利于构建无效的索引和编写查问。咱们稍后会介绍索引。
以前,Spring Data for Apache Geode 用户须要通过编写十分具体的 Spring 配置元数据来明确定义和申明其应用程序应用的区域来存储数据,无论是应用 FactoryBeans 来自 API 的 SDG 和 Spring 的基于 Java 的容器配置 还是应用 XML。
以下示例演示了如何在 Java 中配置 Region bean:
应用 Spring 的基于 Java 的容器配置的示例 Region bean 定义
@Configuration
class GemFireConfiguration {
@Bean(“Example”)
PartitionedRegionFactoryBean exampleRegion(GemFireCache gemfireCache) {
PartitionedRegionFactoryBean<Long, Example> exampleRegion =
new PartitionedRegionFactoryBean<>();
exampleRegion.setCache(gemfireCache);
exampleRegion.setClose(false);
exampleRegion.setPersistent(true);
return exampleRegion;
}
…
}
以下示例演示了如何在 XML 中配置雷同的 Region bean:
应用 SDG 的 XML 命名空间的区域 bean 定义示例
<gfe:partitioned-region id=”exampleRegion” name=”Example” persistent=”true”>
...
</gfe:partitioned-region>
尽管 Java 和 XML 配置都没有那么难指定,但任何一个都可能很麻烦,尤其是在应用程序须要大量区域的状况下。许多基于关系数据库的应用程序可能有数百甚至数千个表。
手动定义和申明所有这些区域会很麻烦且容易出错。好吧,当初有一个更好的办法。
当初您能够依据它们的应用程序域对象(实体)自身定义和配置区域。您不再须要 Region 在 Spring 配置元数据中显式定义 bean 定义,除非您须要更细粒度的管制。
为了简化区域创立,Apache Geode 的 Spring Data 将 Spring Data Repositories 的应用与应用新 @
EnableEntityDefinedRegions 注解的基于注解的配置的表达能力相结合。
大多数 Spring Data 应用程序开发人员应该曾经相熟 Spring Data Repository 形象 和 Spring Data for Apache Geode 的 implementation/extension,它们已专门定制以优化 Apache Geode 的数据拜访操作。
首先,应用程序开发人员首先定义应用程序的域对象(实体),如下所示:
应用领域对象类型建模一本书
@Region(“Books”)
class Book {
@Id
private ISBN isbn;
private Author author;
private Category category;
private LocalDate releaseDate;
private Publisher publisher;
private String title;
}
接下来,您 Books 通过扩大 Spring Data Commons
org.springframework.data.repository.CrudRepository 接口为其定义一个根本存储库,如下所示:
书籍存储库
interface BookRepository extends CrudRepository<Book, ISBN> {..}
Spring 认证中国教育管理中心 -Apache Geode 的 Spring 数据教程十一
这
org.springframe.data.repository.CrudRepository 是一个数据拜访对象 (DAO),提供根本数据拜访操作 (CRUD) 以及对简略查问(例如 findById(..))的反对。您能够通过在存储库接口(例如,List<BooK> findByAuthor(Author author);)上申明查询方法来定义其余更简单的查问。
在底层,当 Spring 容器被疏导时,Spring Data for Apache Geode 提供了应用程序存储库接口的实现。只有您遵循约定,SDG 甚至能够实现您定义的查询方法。
当初,当您定义 Book 类时,您还 Book 通过 @Region 在实体类型上申明 Spring Data for Apache Geode 映射正文来指定映射(存储)实例的区域。当然,如果实体类型(Book 在储存库接口的类型(参数援用,在这种状况下)BookRepository,在这种状况下)不与正文 @Region,名称被从实体类型(简略类名派生也 Book,在这个案例)。
Spring Data for Apache Geode 应用映射上下文(其中蕴含应用程序中定义的所有实体的映射元数据)来确定运行时所需的所有区域。
要启用和应用此性能,请应用 正文应用程序类 @
EnableEntityDefinedRegions,如下所示:
实体定义区域配置
@SpringBootApplication
@ClientCacheApplication
@EnableEntityDefinedRegions(basePackages = “example.app.domain”)
@EnableGemfireRepositories(basePackages = “example.app.repo”)
class ClientApplication {..}
在应用程序中应用 Spring Data Repositories 时,从实体类创立区域最有用。Spring Data for Apache Geode 的 Repository 反对通过 @EnableGemfireRepositories 注解启用,如后面的示例所示。
目前,@Region 扫描仅选取显式正文的实体类,并将创立区域。如果实体类未显式映射,@Region 则不会创立区域。
默认状况下,@
EnableEntityDefinedRegions 正文以递归形式扫描实体类,从 @EnableEntityDefinedRegions 申明正文的配置类的包开始。
然而,通常通过 basePackages 应用蕴含应用程序实体类的包名称设置属性来限度扫描期间的搜寻。
或者,您能够应用类型更平安的 basePackageClasses 属性来指定要扫描的包,办法是将属性设置为蕴含实体类的包中的实体类型,或者应用专门为辨认包而创立的非实体占位符类扫描。
以下示例显示了如何指定要扫描的实体类型:
应用实体类类型的实体定义区域配置
@SpringBootApplication
@ClientCacheApplication
@EnableGemfireRepositories
@EnableEntityDefinedRegions(basePackageClasses = {
example.app.books.domain.Book.class,
example.app.customers.domain.Customer.class
})
class ClientApplication {..}
除了像 Spring 的 @ComponentScan 注解一样指定从哪里开始扫描之外,您还能够应用注解的所有雷同语义来指定 include 和 exclude 过滤
org.springframework.context.annotation.ComponentScan.Filter。