Hibernate Shard基础分析

开发 后端
这里介绍Hibernate Shard 目前通过 Criteria 接口的实现对 聚合提供了较好的支持, 因为 Criteria 以API接口指定了 Projection 操作,逻辑相对简单。
Hibernate Shard有很多值得学习的地方,这里我们主要介绍Hibernate Shard 提供了一种虚拟分区层,包括介绍Hibernate Shard 不支持垂直分区等方面。

1.水平分区下的查询

对于简单查询Hibernate Shard可以满足。

水平分区下多库查询是一个挑战。主要存在于以下三种操作:
1) distinct因为需要遍历所有shard分区,并进行合并判断重复记录。
2) order by类似 1)
3) aggregation count,sim,avg等聚合操作先分散到分区执行,再进行汇总。

是不是有点类似于 MapReduce ? 呵呵。

Hibernate Shard 目前通过 Criteria 接口的实现对 聚合提供了较好的支持, 因为 Criteria 以API接口指定了 Projection 操作,逻辑相对简单。而HQL,原生 SQL 还不支持此类操作。

2. 再分区和虚拟分区

当数据库规模增大,需要调整分区逻辑和数据存储时, 需要再分区。

两种方式:
1)数据库数据迁移其他分区;
2)改变记录和分区映射关系。这两种方式都比较麻烦。尤其“改变记录和分区映射关系”,需要调整 ShardResolutionStrategy.

Hibernate Shard 提供了一种虚拟分区层。当需要调整分区策略时,只需要调整虚拟分区和物理分区映射关系即可。以下是使用虚拟分区时的配置创建过程:

Java代码

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


3.局限:

1)Hibernate Shard 不支持垂直分区, 垂直+水平混合分区。

2)水平分区下 查询功能受到一定限制,有些功能不支持。实践中,需要在应用层面对水平分区算法进行更多的考虑。

3)不支持跨分区的 关系 操作。例如:删除A分区上的 s 表,B分区上的关联子表 t的记录无法进行参照完整性约束检查。 (其实这个相对 跨分区查询的挑战应该说小的多,也许google工程师下个版本会支持,呵呵)

4)解析策略接口似乎和对象ID全局唯一性有些自相矛盾,AllShardsShardResolutionStrategy 的接口返回的是给定对象ID所在的 shard ID集合,按理应该是明确的一个 shard ID.

【编辑推荐】

  1. Hibernate专业知识介绍
  2. 讨论Hibernate和模型对象
  3. Hibernate查询缓存全面分析
  4. 概括Hibernate主键生成机制
  5. Hibernate Pager基础介绍
责任编辑:佚名 来源: IT168
相关推荐

2009-09-22 14:12:16

Hibernate S

2009-09-21 14:24:08

Hibernate3.

2009-09-28 10:39:01

Hibernate基础

2009-06-24 08:05:56

Hibernate基础Configurati

2009-09-21 17:33:50

Hibernate基础

2009-09-23 16:39:51

Hibernate s

2009-09-28 10:14:08

Hibernate基础

2009-09-22 09:27:29

Hibernate P

2009-09-28 10:24:58

Hibernate基础

2009-09-28 10:05:27

Hibernate基础

2009-09-21 13:19:06

Hibernate s

2009-09-21 16:30:20

Hibernate S

2009-09-28 15:38:12

Hibernate P

2009-09-23 13:33:51

Hibernate属性

2009-09-21 18:00:49

Hibernate X

2009-09-24 09:35:47

Hibernate插入

2009-09-23 10:28:16

Hibernate映像

2009-09-22 11:30:57

2009-09-22 17:47:03

Hibernate s

2009-09-23 11:07:11

Hibernate基础
点赞
收藏

51CTO技术栈公众号