针对SaaS应用程序的基于Hibernate框架的数据库分片

针对 SaaS 应用程序的基于 Hibernate 框架的数据库分片

SaaS 正在改变设计、构建、部署和操作应用程序的方式。开发一个 SaaS 应用程序与开发一个通用企业应用程序之间的关键区别在于,SaaS 应用程序必须是多租户的。其他关键 SaaS 需求,比如安全性、定制、面向服务的架构(SOA)和集成,也影响 SaaS 应用程序架构。

多租户是指应用程序在单一代码库内寄存多个承租者并共享数据库等架构的能力。有多种设计选项可启用多租户数据架构 — 每个承租者的专用数据库、每个承租者的共享数据库独立模式,以及所有承租者的碎片数据库共享模式。一种经济高效的策略是,为所有承租者采用一种共享数据库和共享模式策略。采用这种方法会对数据库伸缩带来重大挑战,因为数据库在 SaaS 应用程序支持的所有承租者之间共享。一种简单的方法是基于承租者 ID、通过数据库分片横向扩展共享数据库。

数据库分片 是指对数据库进行水平分区,其中每个分区称为一个碎片。有一些开源以及专用软件,比如 Hibernate Shards、Apache Slice、SQLAlchemy ORM 和 dbShards,可提供分片功能。本文将 Hibernate 作为 J2EE 空间中最常用的 ORM 框架。我们将使用 Hibernate Shards(Hibernate 的一个扩展)解决 SaaS 应用程序的数据库扩展问题,并向 Hibernate 用户提供分片的功能。

SaaS 应用程序的数据库分片

SaaS 应用程序采用一种共享数据库,共享模式的方法,其设计考虑因素在于,当它不能再满足基本性能指标时就需要予以伸缩 — 例如,当太多用户尝试同时访问数据库时,或数据库的大小会导致查询和更新的执行时间太长。横向扩展共享数据库的一种方式是数据库分片。这是横向扩展数据库最有效的方式,因为根据承租者 ID,一个共享模式中的行对于不同承租者是不同的。可以基于承租者 ID 轻松地对数据库进行水平分区。从而便于将属于每个承租者的数据移动到单个分区。

在对多租户 SaaS 应用程序进行数据分区时,我们需要考虑这样的因素,比如因并发用户数量的增多而导致性能降低,或因多个承租者的配置而增加数据库大小,从而影响现有数据库的性能特征。这将有助于您根据单个承租者的数据库大小需求或同时访问数据库的单个承租者的用户数来选择合适的分区技术。数据库分片提供许多优势,比如对数据库的更快读写、改进的搜索响应、更小的表格尺寸以及对表格的按需分配。

Hibernate 数据库分片可用于构建采用其他多租户数据架构选项的 SaaS 应用程序,比如每个承租者的专用数据库,或每个承租者的共享数据库独立模式。Hibernate 数据库分片可以基于承租环境将连接到多个数据库的应用程序代码抽取出来,方法就是提供元数据配置并进行 API 分区,即根据承租环境处理插入数据的操作和从多个数据库中读取数据的操作。

使用 Hibernate Shards 实现分区

Hibernate Shards 是一个旨在通过向 Hibernate Core 添加水平分区支持来封装和最小化这种复杂性的框架。它最小化处理碎片数据的实现复杂性。Hibernate Shards 的主要目标是让应用程序使用标准 Hibernate Core API 查询和办理共享数据集。该方法具有以下优势:

提供非侵入性解决方案来支持数据库分片,同时使用 Hibernate 构建现有 SaaS 应用程序。

允许使用 Hibernate、但尚不需要分片的 SaaS 应用程序采用解决方案,而无需重大重构,前提是它们确实达到了这个阶段。

Hibernate Shards 提供:

Hibernate Core 提供碎片感知的界面扩展,因此代码不需要知道它是在与一个分片数据集交互。充当分片引擎的碎片感知扩展如下所示:

org.hibernate.shards.ShardedSessionFactory

org.hibernate.shards.criteria.ShardedCriteria

org.hibernate.shards.session.ShardedSession

org.hibernate.shards.query.ShardedQuery

实现特定于应用程序的分片策略的界面。上面描述的分片引擎使用应用程序提供的分片策略。

org.hibernate.shards.strategy.access.ShardAccessStrategy — 通过该策略,Hibernate 决定如何跨多个碎片应用数据库操作。每执行一次查询,都会引用该策略。两个默认实现 SequentialShardAccessStrategy 和 ParallelShardAccessStrategy 已经提供。

org.hibernate.shards.strategy.resolution.ShardResolutionStrategy — 该策略用于决定给定 ID 的对象所在的碎片集。碎片解析与 ID 生成相联,Hibernate 为 ID 生成提供多种策略,比如本地、应用程序级 UUID 生成和分布式 hilo 生成。

org.hibernate.shards.strategy.selection.ShardSelectionStrategy — 该策略允许我们决定创建新对象所在的碎片。基于应用程序的需求,我们决定该界面的实现。尽管 Hibernate 最初提供一个开箱即用的循环实现,我们需要为基于 SaaS 的应用程序提供基于承租者 ID 的实现。

时间: 2024-10-31 02:34:54

针对SaaS应用程序的基于Hibernate框架的数据库分片的相关文章

Hibernate框架中的缓存技术详解_java

本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

Hibernate框架数据分页技术实例分析_java

本文实例讲述了Hibernate框架数据分页技术.分享给大家供大家参考,具体如下: 1.数据分页机制基本思想: (1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定. (2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的分布数. (3)确定分页后的总页数.可根据公式:"总页数=(总记录数 - 1) / 每页显示的记录数 + 1". (4)根据当前页数显示数据.如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数. (5)通过For.

深入解析Java的Hibernate框架中的持久对象_java

一.持久对象生命周期应用程序在使用Hibernate框架后,创建的持久对象会经历一整套生命周期来完成数据库的操作,其中主要的三个状态分别是瞬态(Transient).持久化(Persistent).脱管(detached).这三种状态的转换是能够在应用程序中控制的,如下图: 为了能清楚的了解这几种状态,这里使用一个实例来查看下这几种状态下对象的不同,下面状态内的代码,具体步骤如下: (1)创建Hibernate_session程序集,并添加像相应的jar包: (2)配置Hibernate,添加相

基于hibernate实现的分页技术实例分析_java

本文实例讲述了基于hibernate实现的分页技术.分享给大家供大家参考,具体如下: 先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可 先上代码:注意传进来的参数有 Page这类,后面有介绍 public List<Article> queryByPage(final String username, final Page page) { return this.getHibernate

Hibernate框架学习之一:Hello World程序

前言 对一个框架的直观认识,往往是从一个Hello World程序开始.Hibernate是一个ORM(Object Relationship Mapping)对象映射框架.实现了JDBC轻量级的封装,使得在进行JDBC开发的时候可以直接使用面向对象的思维进行开发,说白了Hibernate框架的作用是在Java对象与关系数据库中做了一个映射,使得程序员不用再使用各种SQL了.所以总结Hibernate以下几点: 1.完成了对JDBC的封装,不用再与各种Connection打交道了 2.在业务体系

详解Java的Hibernate框架中的注解与缓存_java

注解Hibernate注解是一个没有使用XML文件来定义映射的最新方法.可以在除或替换的XML映射元数据使用注解. Hibernate的注解是强大的方式来提供元数据对象和关系表的映射.所有的元数据被杵到一起的代码POJO java文件这可以帮助用户在开发过程中同时要了解表的结构和POJO. 如果打算让应用程序移植到其他EJB3规范的ORM应用程序,必须使用注解来表示映射信息,但仍然如果想要更大的灵活性,那么应该使用基于XML的映射去. 环境设置Hibernate注释 首先,必须确保使用的是JDK

实现基于Spring框架应用的权限控制系统

摘要 Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持.Acegi是基于Spring IOC和AOP机制实现的一个安全框架.本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法. 关键词 Spring :Acegi :认证: 授权 引言 近年来,随着Internet技术的迅猛发展,计算机网络已深入到了人们的工作.学习和日常生活中,于是,怎样构建安全的web应用也成为了当前最热门的话

基于Hibernate和Struts的J2EE应用开发

引言 随着Java技术的逐渐成熟与完善,作为建立企业级应用的标准平台,J2EE平台得到了长足的发展.借助于J2EE规范中包含的多项技术:Enterprise JavaBean(EJB).Java Servlets(Servlet).Java Server Pages(JSP).Java Message Service(JMS)等,开发出了许多应用系统.但是,在传统J2EE应用的开发过程中也出现了一些问题:1)数据模型和逻辑模型之间的矛盾.目前使用的数据库基本上都是关系型数据库,而Java本质上是

【HIBERNATE框架开发之一】搭建HIBERNATE环境并成功运行第一个项目HELLOHIBERNATE并解决3个常出现的运行问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/783.html OK,从这篇开始Himi将与大家一起进入Hibernate框架的学习啦,新手新手的说,希望大家多多指教: 对于Hibernate概述一下: "  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. H