关于这个主题的一些额外想法......
使用 Spring 模板进行特定于数据存储的访问(例如 GemfireTemplate)的众多优势之一是它们使开发人员免受模板通常围绕的底层数据存储 API 更改的影响。如果数据存储供应商对 API 接口进行了重大更改(GemFire 就是这种情况),那么模板可以为底层 API 提供一层抽象/适应,而无需更改用户应用程序。
此外,模板可以利用其他 Spring 基础设施管理,例如通常不会固有地内置到底层数据存储 API 本身的事务。模板还可以为底层数据存储产品中的几个不同 API 提供外观和便利层。
例如,GemfireTemplate 封装了“获取”和“放置”数据以及“查询”感兴趣的数据的操作。
要在 GemFire 中执行前者,您需要执行以下操作...
Region<String, SomeValue> example = gemfireCache.getRegion("/Example");
example.put("someKey", new SomeValue(..));
...
SomeValue someValue = example.get("someKey");
在查询“/Example”中的数据时,您会...
Region<String, SomeValue> example = gemfireCache.getRegion("/Example");
QueryService queryService = example.getQueryService();
Query query = queryService.newQuery("SELECT * FROM /Example WHERE ...");
Object result = query.execute(<any args for query parameters>);
if (result instanceof SelectResults) {
SelectResults<SomeValue> someValues = (SelectResults) result;
// process the query results
}
else {
// figure out what happened
}
现在,将其与获取/放置数据的 Spring 模板进行对比
gemfireTemplate.put("someKey", new SomeValue(..));
...
SomeValue someValule = gemfireTemplate.get("someKey");
并查询...
SelectResults<SomeValue> results = gemfireTemplate.find("SELECT * FROM /Example WHERE ...", args);
// process the query results
如果发生异常,或者无法收集结果,则 GemFires 的异常/错误会统一映射到核心 Spring Framework DAO 异常层次结构,这是另一个优势,这使得切换底层数据存储更容易,以及一致的事务处理。
最后,虽然 Thomas Darimont 和 Master Slave 都很好地总结了使用Spring Data Repository 抽象的优势,但这并不是一个新概念。
在 Spring Data 的 Repository 抽象的表达能力和便利性之前,应用程序开发人员将使用 DAO 模式从他们的应用程序服务层中抽象出 CRUD 和其他数据访问操作(例如查询)。
但是,Spring Data 为您提供的是通过简单地为允许的数据访问操作声明合同(Java 接口)来执行此操作的能力,而 Spring Data(包括提供程序特定的实现,如 Spring Data GemFire)负责其余的工作,插入一个“默认”数据存储特定的实现,它是高度可定制的。
显然,我是有偏见的,但是使用接口方法的名称来表达一个查询,使用方法的参数作为 SQL/OQL/etc 查询参数,这简直是太酷了,而且功能强大。
如果查询不复杂或不具体,这可以很容易地从一个数据存储迁移到另一个,甚至在关系和键/值存储之间(例如,考虑到 SQL 和 OQL 之间的相似性的 GemFire)。
希望这可以帮助。干杯!