Hibernate Shards 25 Mar 2014
基本概念
hibernate 中4个核心类
org.hibernate.Session
org.hibernate.SessionFactory
org.hibernate.Criteria
org.hibernate.Query
Hibernate Shards 针对这4个类分别提供了shards扩展,另外,它还提供了
org.hibernate.shards.strategy.selection.ShardSelectionStrategy
org.hibernate.shards.strategy.resolution.ShardResolutionStrategy
org.hibernate.shards.strategy.access.ShardAccessStrategy
3个接口来控制shards策略
ShardAccessStrategy
:用来决定如何在shards中执行数据库操作:
ShardSelectionStrategy
:用来决定一个新的object被创建在那个shard上ShardResolutionStrategy
:用来决定对于一个给定ID,寻找其实体被存在哪些shards上
对于一个多级对象(一个对象中,包含其他复杂对象,而不只包含基本数据类型),hibernate shards只支持将根据其最高级别的对象ID来决定存放在那个shard,其子对象们保存在与其同一个shard中。
Resharding
当数据增长到以前数据库(s)能力无法承受时,我们会希望添加数据库来减轻以前数据库的压力,我们会希望将部分数据迁移到其他数据库中,这个过程叫做resharding Resharding包含两个任务:1.将一个object移动到另一个shard;2.改变object-shard mappings 通常情况下,resharding要求更改这个object的IDs和FKs,更极端的情况,你可能需要更改ShardResolutionStrategy实现(sad) hibernate shards 针对此问题提出了virtual shards概念,在初始化sessionFactory时,创建多个virtual shards,并确立virtual shards与physical shards之间的mapping关系 我们设计shard策略时,只针对virtual shards编码,策略决定一个object存在哪个virtual shard上,当我们需要添加physical shards时,只需要更改virtual shards与physical shards之间的mapping关系即可
query
对于shards环境,数据库内部排序是比较困难的,所以需要Entity classes实现Comparable接口,如果你的entity classes没有实现该接口,会报exception
ps:使用Comparable的话,还会有性能问题
统计问题,对于求平均数,我们必须要知道单个shard中的记录数(hibernate就是这么做的) 同样是性能问题
局限性
可以看到hibernate shards目前还是有很多局限性的
- 部分api未完成
- 跨shards的对象结构
- shards的事务((sad))
- 实体的ids不能为基本类型
- replication,目前仅支持横向切分,所以hibernate shards只适合用在只读或变化比较少的情景下