Hibernate Shards - 关系数据库水平分割解决方案框架

来源:互联网 发布:51单片机计数器程序 编辑:程序博客网 时间:2024/05/20 02:29

 

Hibernate Shards - 关系数据库水平分割解决方案框架

 

来源:

http://www.lifevv.com/java/doc/20070919154358322.html

 

http://developer.51cto.com/art/200909/153237.htm

 

 

随着数据量或业务量的增大,我们可能需要将数据分散到不同的数据库里。这就是分布式数据库技术。

 

分布式数据库技术一般可以从2个方面来实现,纵向分割和横向分割。

所谓纵向分割,即以数据库表为单位进行分割,不同的数据库表存储在不同的数据库里。例如:有数据库表1,2,3,4,5,6;其中表1,2存储在数据库A中,表3,4,5,6存储在数据库B,这样的分割方案便是纵向分割。
所谓横向分割,即让同一个表的数据分别存储在不同的数据库中。例:表1中前10000条数据存储在数据库A中,10001-20000条数据存储在数据库B中,...

数据库分布式是一个比较复杂的技术,需要经过充分设计和验证。
Hibernate Shards是一个Hibernate应用横向分割的分布式数据库解决方案的框架。它可以让一个Hibernate应用比较简单地加入横向分割的数据库分布式功能。

Hibernate Shards主要有以下特点:
1,沿袭Hibernate标准编程模型 - 也就是说如果你已经熟悉了Hibernate,那么也就会了Hibernate Shards,不必要学习新的Hibernate Shards使用方法
2,柔软的分割策略 -你可以使用默认的分割方法,也可以定义你自己的分割策略
3,支持Virtual Shards - 你可以简单地修改分隔策略,Hibernate Shards的此特性让你简单地重新分割你的数据
4,免费,开放源代码 -  Hibernate Shards发布在LGPL (Lesser GNU Public License)授权之下

查看Hibernate Shards快速开发指南,通过它你可以了解怎么样使用Hibernate Shards对数据进行横向分割。


Hibernate Shards:
http://www.hibernate.org/414.html
Hibernate Shards英文文档:
http://www.hibernate.org/hib_docs/shards/reference/en/html/

 

 

 

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. }  

 

 

 

 

原创粉丝点击