快速业务通道

Java开发2.0: 使用Hibernate Shards进行切分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
,Hibernate Shards 需要一个决定首个切分、第二个切分及后续切分的机制。Hibernate Shards 无需确定查询什么(这是 Hibernate Core 和基础数据库需要做的),但是它确实意识到,在获得答案之前可能需要对多个切分进行查询。因此,Hibernate Shards 提供了两种极具创意的逻辑实现方法:一种方法是根据序列机制(一次一个)对切分进行查询,直到获得答案为止;另一种方法是并行访问策略,这种方法使用一个线程模型一次对所有切分进行查询。

为了使问题简单,我将使用序列策略,名称为 SequentialShardAccessStrategy。我们将稍后对其进行配置。

ShardSelectionStrategy

当创建一个新对象时(例如,当通过 Hibernate 创建一个新 Race 或 Runner 时),Hibernate Shards 需要知道需将对应的数据写入至哪些切分。因此,您必须实现该接口并对切分逻辑进行编码。如果您想进行默认实现,有一个名为 RoundRobinShardSelectionStrategy 的策略,它使用一个循环策略将数据输入切分中。

对于赛跑应用程序,我需要提供根据比赛距离进行切分的行为。因此,我们需要实现 ShardSelectionStrategy 接口并提供依据 Race 对象的 distance 采用 selectShardIdForNewObject 方法进行切分的简易逻辑。(我将稍候在 Race 对象中展示。)

运行时,当在我的域对象上调用某一类似 save 的方法时,该接口的行为将被深层用于 Hibernate 的核心。

清单 1. 一个简单的切分选择策略

import org.hibernate.shards.ShardId; import org.hibernate.shards.strategy.selection.ShardSelectionStrategy; public class RacerShardSelectionStrategy implements ShardSelectionStrategy {  public ShardId selectShardIdForNewObject(Object obj) {  if (obj instanceof Race) {   Race rce = (Race) obj;   return this.determineShardId(rce.getDistance());  } else if (obj instanceof Runner) {   Runner runnr = (Runner) obj;   if (runnr.getRaces().isEmpty()) {   throw new IllegalArgumentException("runners must have at least one race");   } else {   double dist = 0.0;   for (Race rce : runnr.getRaces()) {    dist = rce.getDistance();    break;   }   return this.determineShardId(dist);   }  } else {   throw new IllegalArgumentException("a non-shardable object is being created");  } }  private ShardId determineShardId(double distance){  if (distance > 10.0) {   return new ShardId(1);  } else {   return new ShardId(0);  }  } }

Java开发2.0: 使用Hibernate Shards进行切分(3)

时间:2010-10-26 IBM Andrew Glover

如您在 清单 1 中所看到的,如果持久化对象是一场 Race,那么其距离被确定,而且(因此)选择了一个切分。在这种情况下,有两个切分:0 和 1,其中切分 1 中包含 10 英里以上的比赛,切分 0 中包含所有其他比赛。

如果持久化一个 Runner 或其他对象,情况会稍微复杂一些。我已经编码了一个逻辑规则,其中有三个原则:

一名 Runner 在没有对应的 Race 时无法存在。

如果 Runner 被创建时参加了多场 Races,这名 Runner 将被持久化到寻找到的首场 Race 所属的切分中。(顺便说一句,该原则对未来有负面影响。)

如果还保存了其他域对象,现在将引发一个异常。

然后,您就可以擦掉额头的热汗了,因为大部分艰难的工作已经搞定了。随着比赛应用程序的增长,我所使用的逻辑可能会显得不够灵活,但是它完全可以顺利地完成这次演示!

Shar

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号