文档章节

用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:17
字数 734
阅读 118
收藏 1

这里的云计算多租户是指一个web应用,多个数据库。每一个租户对应着一个数据库。 

数据库方面,简单分为一个基本库,记录着基本信息与租户的信息,还有租户数据库配置信息。N个租户库,这N个租户库,可能分布在一台服务器上,也可能分布在N台服务器上,可能两者兼有。所以在基本库中的租户的数据库所在服务器信息(下面称为数据源信息)与数据库信息。 

Play的数据源配置,在conf/application.conf中,如:

jpa.dialect=org.hibernate.dialect.MySQLDialect
db.url=jdbc:mysql://basedbip:3306/pop?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
db.driver=com.mysql.jdbc.Driver
db.user=root
db.pass=root
db=pop

db_01.url=jdbc:mysql://anotherdbip:3306/pop?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
db_01.driver=com.mysql.jdbc.Driver
db_01.user=root
db_01.pass=root
db_01=pop01

因为Play是无状态的轻框架,所以要保持某个租户下面的单个用户一次会话中不同时间不同链接请求的库信息一样,就必须有相应的切库逻辑。同时需要有必要的切库凭证数据。 

我们可以在登陆的时候,将用户的登陆信息与之对应租户的数据库信息封装成一个对象,以该登陆信息对象为value,用户本次会话的sessionid为Key,存放在缓存之中,如redis。 

每次请求来临的时候,根据sessionid,从缓存中获取登陆信息对象,如果没有,则可认为该用户没有登陆,将其指向登陆页面(这里需要设定白名单,将登陆的链接排除)。 如果有对象,则将数据库信息取出,利用setCurrentConfigName切换数据源

JPA.setCurrentConfigName(dbconfigname);

利用user切换数据库

JPA.em().createNativeQuery("use "+dbname).executeUpdate();

从而达到了切库功能,在这个地方,不能使用@before注解,因为play框架会对请求参数中的对象参数数据进行JPA查询分装,而这个处理时机在处理@before之前,详细的请参考: Play 1.x框架学习之七:多数据库切换与源码修改 ( Databases Switch And Modify Source Code) 

如果修改Play源码之后,就可就行自由切库。 

有一个地方需要注意的是,如果用户表数据不是存放在基础库而是在租户库中,这时候就需要一个原始的切库凭据(如果没有,则无法到相应的租户库获取用户数据进行登录校验),这里提供两种解决方法,一是可以在登陆的时候让用户多填写一个与租户相关的凭证,也可以根据不同的租户,提供不同的url入口,来达到相同的结果,这样的用户体验较第一种好。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
#技术分享# -- 云计算下的数据隔离

IT软件服务商所提供的传统企业软件系统大多基于Multi-Instance(多实例)架构,即对于每一个客户组织,都有一个单独的软件系统实例 为其服务;而搭建于云计算平台的软件系统则广泛采用了Mul...

边缘行者
2012/12/19
0
0
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

曾沙
2012/11/26
348
0
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

红薯
2012/03/14
13.2K
20
greenlaw110/Rythm

Rythm A "Razor" like, rich featured, high performance and easy to use Java template engine Links: The documentation The fiddle site Integrations play-rythm for Play!Framework 1.......

greenlaw110
2015/05/06
0
0
关于Play(Play 2.0 介绍)

Play 2.0 介绍 2007开始,我们一直致力于让Java开发web应用更容易。Play始于一个内部项目Zenexity,它深刻影响了我们开发web项目的方式:关注开发者生产力,遵循web架构的特点,并打破常规,...

大东哥
2012/03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据技术的发展趋势

大数据领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。这些技术下一步将如何发展?它们之中哪些技术将广为流行?又会诞生哪些新的技术? 技术趋向多样化,...

董黎明
15分钟前
2
0
藏在正则表达式里的陷阱

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所...

前端小攻略
17分钟前
0
0
TensorFlow的基础概念01

概念: TensorFlow是一个深度学习框架,人人都能实现机器学习。 import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'import tensorflow as tf#导入对应的TensorFlow#输出Hello W...

怪咖先生forever
18分钟前
0
0
关联更新,关联查询

关联更新 update A,B SET A.c1=B.c1,A.c2=B.c2 where A.id=B.id and ... update A inner join on A.id=B.id set A.c1=B.c1,A.c2=B.c2 where... 关联查询 交叉连接(cross join),内连接(inner ......

关元
21分钟前
0
0
django的环境搭建及启用

Pycharm社区版不像商业版那样可以直接创建django工程,需要通过一下步骤创建: 新建一个用于Django开发的虚拟环境 打开命令窗口 新建虚拟环境: conda create -n env_name python=3.6 查看系...

davidwbnu
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部