`
wutao8818
  • 浏览: 612654 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate Shards 概略

阅读更多
来自 hibernate_shards中文参考指南

分片策略

配置的入口是接口
org.hibernate.shards.strategy.ShardStrategy:


public interface ShardStrategy {
  ShardSelectionStrategy getShardSelectionStrategy();
  ShardResolutionStrategy getShardResolutionStrategy();
  ShardAccessStrategy getShardAccessStrategy();
}



ShardAccessStrategy
决定在多个片段(shards)上怎样执行数据库操作,无论什么时间你在分段上执行一次查
询都要询问 ShardAccessStrategy

接口的两个实现
SequentialShardAccessStrategy                   
查询在你的片段(shards)上是顺序地执行的。

ParallelShardAccessStrategy
查询在你的片段(shards)上是并发地执行的

ShardSelectionStrategy
决定在哪个片段(shard)上创建一个新对象
提供了一个轮询(round-robin)的实现(RoundRobinShardSelectionStrategy)
程序应该可以实现基于属性的分片

一个多层次的关联对象(multi-level object graph)通过 Hibernate 级联功
能存储时,ShardSelectionStrategy 只会在存储顶层对象考虑,所有子对象(children objects)将会自动的存储在和父对象(parent)相同的片段上
如果你不希望你的模型(model)有这个限制,那么很好,只要记住,你在做基于属性的分片(shard)选择,你所使用的用来做决定的属性必须在传递给 session.save()时的每个对象里得到。


ShardResolutionStrategy
解析出一个指定 id 对象在哪个片段集合(set of shards)
ShardResolutionStrategy 是管理实体(entity)名字/标识符(id)映射片段(shard)缓存(cache)的绝好地方。

标识符生成(ID Generation)对片段选取(Shard Resolution)影响很大。如果你为你的类选择一个标识符生成器(ID Generation),把 shard id 编码在对象的标识符(id)内,你的ShardResolutionStrategy 将永远不会被调用。如果你计划只使用把 shard id 编码在你的对象的标识符(ids) 里的标识符生成器(ID generators) 你应当使用 AllShardsShardResolutionStrategy ,作为你的 ShardResolutionStrategy。

片段选取(Shard Resolution)对标识符生成(ID Generation)影响很大,片段选取(shard ,有两种方式实现这resolution)的目的是找到一个指定标识符对象所在的存储片段(shard)个目的:
     使用 ShardResolutionStrategy,上述。
     在生成标识符(ID)时把 shard ID 编码到对象的标识符(ID)上,并在片段选取(shardresolution)时检索 Shard ID。

把 shard ID 编码到对象标识符(ID)的主要优点是它能够使 Hibernate Shards 能够更快的从而不需要数据库查询,缓存查询,等等。
对象标识符选取片段(resolve shard)                                   Hibernate Shards
不需要任何特殊编码/解码的 shard ID 算法——所有你需要做的是使用一个标识符生成器
(ID Generator)实现 ShardEncodingIdentifierGenerator 接口。Hibernate Shards 所包含的两个标识符生成器(ID generators),ShardedUUIDGenerator 实现了该接口。



ID Generation

1.Native ID 生成策略
2.配置你的数据库来避免标识符(IDs)冲突
3.应用程序级别的 UUID
4.分布式 hilo 生成器



二次分片
虚拟片段(Virtual Shards)
为了能够使用虚拟分片(virtual sharding),你需要使用从虚拟的 shard ids 到物理 shard ids为了能够使用虚拟分片(virtual sharding)映射的 Map 来创建你的 ShardedConfiguration,这里我们有 4 个虚拟片段(virtual shards)映射 2 个物理片段(physical shards)的示例:

Map<Integer, Integer> virtualShardMap = new HashMap<Integer,Integer>();
virtualShardMap.put(0, 0);
virtualShardMap.put(1, 0);
virtualShardMap.put(2, 1);
virtualShardMap.put(3, 1);
ShardedConfiguration shardedConfig =
     new ShardedConfiguration(
          prototypeConfiguration,
          configurations,
          strategyFactory,
          virtualShardMap);
return shardedConfig.buildShardedSessionFactory();



为了在以后改变虚拟片段到物理片段的映射,只需要改变传递到这个构造器的virtualShardToShardMap 。

查询(Querying)
限制
1.order-by 子句
2.Distinct 子句
aggregation 工作的很好

HQL
为 HQL 的支持,在这点上,并没有像 Criteria 查询那样有良好的支持,我们甚至没有
实现任何一个查询解析的扩展,所以我们不支持 distinct、order-by 和 aggregation,即就是你.只能使用 HQL 进行简单的查询,你最好能够在这次发布中清除所有的 HQL 除非你能想到办法。



查询时使用分片策略(Shard Strategy)
你的当执行查询(Criteria 或者 HQL)所参考的分片策略(shard strategy)的唯一组成部分是 ShardAccessStrategy
ShardSelectionStrategy 被忽略了是因为执行一次查询不需要在数据
库创建任何新的记录;ShardResolutionStrategy 被忽略的因为目前我们假设你总是希望在所有的片段(Shards)上执行你的查询。


如果情况并不是这样,那么最好把 Session 向下强制类型转化(downcast)成一个 ShardedSession,并找出你要的特定分片(shard-specific)的SessionS。虽然有点笨,但是它起作用,在以后的发布我们为其会有一个更好的解决方案。


未完成的Hibernate API实现

跨片段的关联对象(Cross-Shard Object Graphs)
当 A 对象和 B 对象在不同的片段(shards)上时,创建一个 A 和 B 的关联是非
法的。在某些应用程序里,你的 model 对象以这种方式构造是很难犯这种错误
Hibernate 将会认为是列表里的“糟糕的(bad)”对象,并假定你启用了级联这种关系,它将在不同片段(shard)上创建这个对象的新版本,这会出现问题。为了帮助防止这种事情发生,我们使用了一个在所有创建 或 保 存 的 对 象 时 检 查 跨 片 段 ( cross-shard ) 的 关 系 的 拦 截 器 ( interceptor ) 命 名 为CrossShardRelationshipDetectingInterceptor 。

不幸的是,使用 CrossShardRelationshipDetectingInterceptor 是有代价的,为了决定一个关联的对象在哪个片段(shard)上,我们需要从数据库获得这个对象,所以你如果使用延迟加载(lazy-loaded)关联,拦截器将会把查询这些关联关系作为其检查的一部分。这种代价可能 是 相 当 昂 贵 的 , 可 能 不 适 合 产 品 系 统 。 考 虑 到 这 点 , 我 们 通 过hibernate.shard.enable_cross_shard_relationship_checks 属性(参考配置章节)来简单地配置是否 需 要 执 行 检 查 , 如 果 此 属 性 设 为 true , 在 建 立 每 个 ShardedSession 会 话 的 时 候CrossShardRelationshipDetectingInterceptor 对象都会被注册。别担心,你也能注册自己的拦截器。我们希望大多数应用在 dev 和 qa 环境时将会启用这个检查,而在分段(staging)、负载(load)、性能测试(perfomance),生产(production)环境禁止。


分布式事务

Hibernate Shards 在一个非容器托管(non-managed)的环境里不提供分布式事务的支持,如果你的应用程序需要分布式事务,你需要插入一个支持分布式事务的事务管理实现(transaction management implementation)。


有状态的拦截器(Stateful Interceptors)


深层次的原因是,我们为每一个片段(shard)  初始化一个org.hibernate.SessionImpl。如果我们希望一个拦截器(Interceptor)关联到一个会话(Session) ,那么我们在 ShardedSession 被创建时,需要传递所有提供的拦截器(Interceptor)
可以选择由 StatefulInterceptorFactory 构造的拦截器(Interceptor)
的类型实现 RequiresSession 这个接口的。一旦工厂构造它的时候,Hibernate Shards 将会提
供指向真正的(指定片段的(shard-specific))会话(Session)的拦截器(Interceptor)。这样,你的拦截器(Interceptor)能够安全,准确地和特定的片段(shard)交互



冗余数据(Replicated Data)
尽管这是一个水平分片的框架,但在每个片段(Shard)上,几乎总是存在一些只读(至少
是很少改变的)的数据,如果你只是读取这些数据,我们不会有问题的,但是如果你希望通
过分片的实体关联这些实体,我们就有麻烦。假如你在每一个片段(Shard)上有一个数据
完 全 相 同 的 国 家 表 , 假 定 WeatherReport 有 一 个 Country 成 员 , 我 们 怎 么 保 证 那 个WeatherReport 关联的 Country 和 WeatherReport 是在同一个片段(shard)上。我们有很多想法来让这个问题容易处理,但是我们还没有任何实现。从短期来看,我们认为你最好的选择是也不要创建分片实体和冗余实体之间的关联。换句话说,   如果你不使用建模工具,选择你会的方式为关系建模。我们知道这个有点笨和讨厌,我们会马上解决它。



从美学角度来看,这个实现并不太好.代码何必关心放到哪个数据库.不到万不得已的数据量,还是 mysql proxy来的透明,轻松实现也快,关键是我不需要写额外的代码.来自一个懒得写代码的程序员
分享到:
评论

相关推荐

    使用 Hibernate Shards 对数据进行切分

    《使用Hibernate Shards对数据进行切分》 在大规模分布式系统中,数据库的扩展性问题一直是开发者关注的重点。Hibernate Shards是Hibernate框架的一个扩展,它提供了数据库分片(Sharding)的功能,帮助解决高并发...

    hibernate-shards.jar

    GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 ... 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies ...

    hibernate-shards-3.0.0.Beta2.zip

    《Hibernate Shards:分布式数据库解决方案的深度解析》 Hibernate Shards是Hibernate框架的一个扩展,它为大型分布式系统提供了数据分片的功能。这个扩展允许开发者在多个数据库实例上分散存储数据,以实现高可用...

    hibernate-shards:Hibernate ORM的水平分区

    《Hibernate Shards:Hibernate ORM的水平分区探索》 Hibernate Shards是Hibernate ORM框架的一个扩展,专门设计用于处理大数据量的分布式环境中的水平分区问题。然而,值得注意的是,这个项目目前已经不再受到官方...

    计算机-软件工程-外文翻译-外文文献-英文文献.doc

    2. Hibernate Shards:Hibernate Shards 是一个基于 Java 的开源框架,用于实现数据库切分。它可以将一个大型数据库拆分成多个小的逻辑数据库,并提供了易于使用的 API 来管理这些小数据库。 3. 切分策略:文章讨论...

    基于MyBatis的数据库切分框架可实现数据的水平切分和垂直切分源码.zip

    MyBatis Shards在实现方式上完全借鉴于Hibernate Shards,目前可以认为是Hibernate Shards的一个迁移版本。 MyBatis Shards概述 MyBatis Shards采用无侵入性的方式,无需更改现有程序代码,只要根据现有业务编写...

    Shards是免费现代的Bootstrap4UI工具包

    【标题】"Shards:免费现代的Bootstrap4 UI工具包" 在Web开发领域,界面设计与用户体验至关重要。Bootstrap作为一款广泛使用的前端框架,为开发者提供了快速构建响应式和移动优先的网站的能力。而"Shards"是基于...

    mybatis-shards:基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分

    MyBatis Shards在实现方式上完全借鉴于Hibernate Shards,目前可以认为是Hibernate Shards的一个迁移版本。 MyBatis Shards概述 MyBatis Shards采用无侵入性的方式,无需更改现有程序代码,只要根据现有业务编写合理...

    hibernate-sharding

    Hibernate分片 用于演示Hibernate分片的示例项目。 hibernate1.cfg.xml文件的第一个碎片 hibernate2.cfg.xml用于第二个分片 应用程序脱机启动共享ID生成,分片选择和分片解析策略。 在构建项目之前执行maven-...

    Hibernate3详解

    4. Hibernate Shards:水平数据分区框架,用于分布式数据库管理。 5. Hibernate Validator:数据完整性和验证API。 6. Hibernate Search:与Lucene集成,用于索引和查询数据。 7. Hibernate Tools:为Eclipse和Ant...

    Hibernate的版本

    Hibernate Shards (3.0.0 Beta) - **发布日期**:2007年08月02日 - **状态**:开发中(Development) 这是一个实验性质的项目,旨在支持数据分片。尽管还处于测试阶段,但已经可以用于实现水平分区策略,以提高大...

    Mirror.The.Lost.Shards.Update.v3.10_补丁_Lost!_emoji_

    该补丁的文件名"Mirror.The.Lost.Shards.Update.v3.10"直接反映了其核心内容,即对《魔镜:失落碎片》的v3.10版本进行更新。从命名来看,我们可以推测这个更新可能包含了对游戏性能的优化、bug修复以及新内容的添加...

    Hibernate深入浅出

    最后,可能会涉及一些进阶话题,比如Hibernate与JPA的比较、Shards和多数据源配置,以及如何在分布式环境中使用Hibernate等。 总的来说,《Hibernate深入浅出》是一本覆盖了Hibernate各个方面知识的全面指南,无论...

    ShardsVue是一款基于Shards的免费美观且现代的VuejsUI工具包

    ShardsVue是一款专为Vue.js开发者设计的免费且现代的UI工具包,它构建于Shards库之上,提供了丰富的组件和样式,旨在帮助开发者快速构建具有吸引力的前端界面。ShardsVue的出现,使得Vue.js项目的界面设计变得更加...

    shards.zip

    一个现代且免费的Bootstrap 4后台管理模块,用起来非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,非常丝滑,...

Global site tag (gtag.js) - Google Analytics