Hibernate Shard三种策略剖析

开发 后端
这里介绍Hibernate Shard多数据库水平分区解决方案。Hibernate 的一个扩展,用于处理多数据库水平分区架构。由google工程师 2007年 捐献给 Hibernate社区。

在向大家详细介绍Hibernate Shard三种策略之前,首先让大家了解下Hibernate Shard简介,然后全面介绍Hibernate Shard三种策略。

1. Hibernate Shard简介

Hibernate Shard多数据库水平分区解决方案。Hibernate 的一个扩展,用于处理多数据库水平分区架构。由google工程师 2007年 捐献给 Hibernate社区。

目前版本: 3.0.0 beta2, 未发GA版。

条件:Hibernate Core 3.2, JDK 5.0

2. 水平分区原理

一个库表如 Order 存在于多个数据库实例上。按特定的分区逻辑,将该库表的数据存储在这些实例中,一条记录的主键 PK,在所有实例中不得重复。

水平分区在大型网站,大型企业应用中经常采用。目的出于海量数据分散存储,分散操作,分散查询以便提高数据处理量和整体数据处理性能。使用:google工程师的设计还是非常好的,完全兼容 Hibernate本身的主要接口。

Java代码

  1. org.hibernate.Session  
  2. org.hibernate.SessionFactory  
  3. org.hibernate.Criteria  
  4. org.hibernate.Query 

因此程序员开发变化不大,甚至不需要关心后台使用了分区数据库。程序迁移问题不大。而且配置上比较简明。

3. Hibernate Shard三种策略:

◆ShardAccessStrategy, 查询操作时,到那个分区执行。

默认提供两个实现:顺序策略:SequentialShardAccessStrategy, 每个query按顺序在所有分区上执行。

平行策略:ParallelShardAccessStrategy, 每个query以多线程方式并发平行的在所有分区上执行。此策略下,需要使用线程池机制满足特定的性能需要,java.util.concurrent.ThreadPoolExecutor.

◆ShardSelectionStrategy, 新增对象时,存储到哪个分区。

框架默认提供了一个轮询选择策略 RoundRobinShardSelectionStrategy, 但一般不这样使用。

通常采用“attribute-based sharding”机制,基于属性分区。一般是用户根据表自己实现一个基于属性分区的策略类ShardSelectionStrategy ,例如,以下WeatherReport基于continent属性选择分区:

Java代码

  1. public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {  
  2. public ShardId selectShardIdForNewObject(Object obj) {  
  3. if(obj instanceof WeatherReport) {  
  4. return ((WeatherReport)obj).getContinent().getShardId();  
  5. }  
  6. throw new IllegalArgumentException();  

◆ShardResolutionStrategy, 该策略用于查找单个对象时,判断它在哪个或哪几个分区上。

默认使用 AllShardsShardResolutionStrategy ,可以自定义例如:

Java代码

  1. public class WeatherReportShardResolutionStrategy 
    extends AllShardsShardResolutionStrategy {  
  2. public WeatherReportShardResolutionStrategy(List<ShardId> shardIds) {  
  3. super(shardIds);  
  4. }  
  5.  
  6. public List<ShardId> selectShardIdsFromShardResolutionStrategyData(  
  7. ShardResolutionStrategyData srsd) {  
  8. if(srsd.getEntityName().equals(WeatherReport.class.getName())) {  
  9. return Continent.getContinentByReportId(srsd.getId()).getShardId();  
  10. }  
  11. return super.selectShardIdsFromShardResolutionStrategyData(srsd);  
  12. }  

【编辑推荐】

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

2009-09-22 14:23:37

Hibernate S

2020-02-26 11:07:26

网络5G技术

2009-06-23 10:45:18

Hibernate支持

2009-09-24 11:17:32

Hibernate查询

2009-09-25 15:58:04

Hibernate对象

2009-06-29 18:21:29

Hibernate

2018-06-29 10:54:11

云部署策略公共云

2009-12-11 13:48:47

双线策略路由

2023-04-10 11:22:34

CIOIT运营成本

2019-09-11 15:49:02

入侵检测反分析逃逸技术

2021-12-23 06:57:32

企业策略数据

2009-09-25 14:12:16

Hibernate继承

2009-05-08 15:29:53

2024-04-01 13:02:00

发布策略API

2018-06-23 00:02:44

2009-07-29 11:44:30

ASP.NET缓存Cache

2019-09-16 09:46:55

2019-09-16 09:46:55

对抗反分析检测逃逸恶意软件

2023-03-06 08:40:43

RedisListJava

2009-09-27 13:42:05

Hibernate E
点赞
收藏

51CTO技术栈公众号