竹笋

注册

 

发新话题 回复该主题

Spring认证中国教育管理中心Apa [复制链接]

1#

原标题:Spring认证中国教育管理中心-ApacheGeode的Spring数据教程十八(Spring中国教育管理中心)

7.使用ApacheGeodeAPI

一旦配置了ApacheGeodeCache和Regions,它们就可以被注入并在应用程序对象中使用。本章描述了与Spring的事务管理功能和DAO异常层次结构的集成。本章还介绍了对ApacheGeode管理对象的依赖注入的支持。

7.1.Gemfire模板

与Spring提供的许多其他高级抽象一样,SpringDataforApacheGeode提供了一个模板来简化ApacheGeode数据访问操作。该类提供了几种包含常见Region操作的方法,但也提供了针对本机ApacheGeodeAPI执行代码的功能,而无需使用GemfireCallback.

模板类需要一个ApacheGeodeRegion,一旦配置,就是线程安全的,并且可以跨多个应用程序类重用:

beanid="gemfireTemplate"class="org.springframework.data.gemfire.GemfireTemplate"p:region-ref="SomeRegion"/

配置模板后,开发人员可以将其与GemfireCallbackApacheGeode一起使用,Region而无需处理检查异常、线程或资源管理问题:

template.execute(newGemfireCallbackIterableString(){  publicIterableStringdoInGemfire(Regionregion)  throwsGemFireCheckedException,GemFireException{    RegionString,StringlocalRegion=(RegionString,String)region;    localRegion.put("1","one");    localRegion.put("3","three");    returnlocalRegion.query("length5");  }});

为了充分发挥ApacheGeode查询语言的威力,开发者可以使用findandfindUnique方法,与方法相比query,可以跨多个Region执行查询,执行投影等。

find当查询选择多个项目(通过SelectResults)时应该使用该方法,而后者,findUnique顾名思义,当只返回一个对象时。

7.2.异常翻译

使用新的数据访问技术不仅需要适应新的API,还需要处理特定于该技术的异常。

为了适应异常处理的情况,Spring框架提供了一个技术无关且一致的异常层次结构,将应用程序从专有的、通常是“检查的”异常抽象为一组集中的运行时异常。

正如SpringFramework的文档中所提到的,通过定义bean使用注释和AOP,异常转换可以透明地应用于您的数据访问对象(DAO)。使用ApacheGeode时,只要声明了相同的异常转换功能,就会启用相同的异常转换功能,例如使用a或声明,它充当异常转换器并由Spring基础设施自动检测并相应地使用。

RepositoryPersistenceExceptionTranslationPostProcessorCacheFactoryBeangfe:cache/gfe:client-cache

7.3.本地、缓存事务管理

Spring框架最流行的特性之一是事务管理。

如果你不熟悉Spring的事务抽象那么我们强烈建议您阅读有关Spring的事务管理的基础设施,因为它提供了一个一致的编程模型,跨多个API透明地工作,并且可以通过编程方式或声明(最流行的选择)配置。

对于ApacheGeode,ApacheGeode的SpringData提供了一个专用的每个缓存PlatformTransactionManager,一旦声明,就允许通过Spring原子地执行Region操作:

使用XML启用事务管理

gfe:transaction-managerid="txManager"cache-ref="myCache"/

上面的例子中,可以通过消除甚至进一步简化cache-ref,如果在Apache的Geode缓存下默认名称定义的属性,gemfireCache。与其他SpringDataforApacheGeode命名空间元素一样,如果未配置缓存bean名称,则将使用上述命名约定。此外,如果未明确指定,事务管理器名称为“gemfireTransactionManager”。

目前,ApacheGeode支持具有读提交隔离的乐观事务。此外,为了保证这种隔离,开发人员应避免进行手动修改缓存中存在的值的就地更改。为了防止这种情况发生,事务管理器默认将缓存配置为在读取时使用复制语义,这意味着每次执行读取时都会创建实际值的克隆。如果需要,可以通过copyOnRead属性禁用此行为。

由于在启用读取时复制时会复制给定键的值,因此您必须随后调用Region.put(key,value)inorder以事务方式更新值。

有关底层Geode事务管理器的语义和行为的更多信息,请参阅GeodeCacheTransactionManagerJavadoc。

公共接口CacheTransactionManager

CacheTransactionManager接口允许应用程序在每个Cache基础上管理事务。

GemFire事务的生命周期从开始操作开始。生命周期以提交或回滚操作结束。在开始和提交/回滚之间通常是Region操作。通常,那些创建、销毁、失效或更新的操作Region.Entry被认为是事务性的,即它们修改事务状态。

一个GemFire事务可能涉及对多个区域的操作,每个区域可能具有不同的属性。

在本地VM中调用GemFire事务及其操作时,根据每个参与区域的属性,在提交时将生成的事务状态分发到其他VM。

一个事务最多只能有一个与之关联的线程,相反,一个线程在任何给定时间只能对一个事务进行操作。子线程不会继承现有事务。

以下每个方法都在当前线程上运行。CacheClosedException如果Cache关闭,则所有方法都会抛出。

GemFireTransactions目前只支持ReadCommitted隔离。此外,它们是乐观事务,因为写锁定和冲突检查是作为提交操作的一部分执行的。

为了保证读已提交隔离,避免进行“就地”更改,因为此类更改将被其他事务“看到”并破坏读已提交隔离保证。例如

CacheTransactionManagertxMgr=cache.getCacheTransactionManager();txMgr.begin();StringBuffers=(StringBuffer)r.get("stringBuf");s.append("提交前看到的更改。未提交读取!");r.put("stringBuf",s);txMgr.

分享 转发
TOP
发新话题 回复该主题