在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法

SpringBoot JPA连接PostgreSQL时,如何优雅地切换和使用不同的数据库模式(Schema)? 本文详细探讨了在SpringBoot JPA环境下如何优雅地动态切换和管理PostgreSQL的多Schema。通过对比基础配置方案和动态切换方案,提供了多数据源、动态SQL改写和混合模式三种生产级实践方法,帮助开发者实现数据逻辑隔离和模块化设计,提升系统性能和可维护性。 阅读详情

需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的schema做操作。
比如,如果当前处理的是A公司,那么向SchemaA 里面保存数据,
如果当前处理的是B公司的,则向SchemaB里面保存数据。

其实就是一套程序,实现后台的动态切换。

我这里提供几种方法,大家自己根据情况考虑,都能实现,注意是实现,不一定适合于正式应用。
方法一:
在Hibernate里面,有一个配置参数,比如下面这个带Schema配置的映射


其中的schema="P_BEIJING"将 Schema写死了。
我们可以不写这部分,而是使用系统的配置参数
<property name="hibernate.default_schema">POI_BEIJING</property>

这样的话,我们的映射文件就变成了


在调用的时候,动态的指定Schema的参数就行了,比如


这个方法能实现切换,但是我们必须每次都返回一个SessionFactory, 否则在并发的时候就会出问题。因为hibernate.default_schema系统只有一个。


方法二:
使用多重配置,比如针对天津和北京,我们分别编写对应的映射文件

配置文件除了SCHEMA和ID不同外,其它的完全相同,那么如何使用呢?
sessionFactory.getBean("P"+placeName);
这样就可以实现动态调用了。
至于placeName,可以通过前台调用程序传递过来,也可以放到ThreadLocal里面,后者更具有通用性,而且对以前的程序修改量最少,因为只需要写一个getPlaceName()得方法就行了。

方法3:
修改数据库的连接属性,将以前指向SchemaA的改成指向SchemaB,这需要一些高权限的账号做这些事情。
其实,还有一个更简单的方法,那就是自己继承一个DataSource,然后在方法里面,根据ThreadLocal的参数,返回不同的数据连接。比如如果是BEIGJING,则返回 BeiJingDatasource的连接,如果是TIANJIN,则返回TianJinDatasource的连接。
系统在使用时,肯定会从DataSource里面获取连接,我们在内部做了分配,自然前台运行结果也就分配开了。
提示:在你的DataSource里面可以包含Map<String,DataSource>这样的结构,来做内部的转发。


个人总结:
第一种方法只适合于单机,单线程使用。
第二个方法,相对技术难度低一点,单配置起来要写多份,维护比较麻烦
第三个方法,技术难度高,单维护起来简单

我个人当然是用第三个方法了,很有趣。

Java 中实现多租户架构:数据隔离策略与实践指南 本文介绍了Java中实现多租户架构的两种主要方式:共享数据库分离Schema和共享Schema通过tenant_id字段区分数据。第一种方式通过动态切换数据库Schema实现数据隔离,适合中大型SaaS应用;第二种方式通过在表中添加tenant_id字段并自动注入查询条件,更适合租户数量大的场景。文章详细分析了两种方案的实现方法,并针对常见问题如数据越权、跨租户查询和上下文传递等提供了解决方案。同时强调了索引设计和权限控制的重要性,为开发者构建安全高效的多租户系统提供了实用指导。 阅读详情

相关推荐

Spring+Hibernate下的数据库连接动态切换

Spring+Hibernate下的数据库连接动态切换

hibernate.default_schema

Oracle: hibernate.default_schema=用户名 Mysql: hibernate.default_schema=数据库名称

Code-Create-World 5421

原子力显微镜AFM图像处理软件Gwyddion使用教程(图文)

Gwyddion使用教程Gwyddion简介Gwyddion user guide下载地址本次教程用的AFM扫描图像下载地址AFM/STM校准样品Gwyddion使用step1step2step3step4step5step6step7step8你没见过的CD磁道到底长啥样一张图总结 Gwyddion简介        &nbs...

王纯配的博客 5万+

使用Hibernate时如何切换schema

在使用Hibernate进行开发时,为了能够让开发的产品运用到多个项目中,经常会遇到需要在同一个数据库服务器上部署多个相同库结构的数据库的情况。为了节省资源,常常是在原有数据库实例下新建一个数据库(对于Oracle来说,就是新建一个用户)。否则就得部署多个数据库服务了,得不偿失。 但是笔者在实际中发现,仅仅是修改Hibernate配置文件中连接的用户名是不够的。需要注意实体类映射文件中的配置。 ...

greatfeather的专栏 765

(8)机器人动力学

机器人是一个具有多输入多输出的复杂动力学系统,存在严重的非线性,需要非常系统的方法对机器人进行动力学研究。常用的机器人动力学建模方法有:Lagrange(拉格朗日)动力学方法、Newton-Euler(牛顿-欧拉)动力学方法、Gauss(高斯)动力学方法、Kane(凯恩)动力学方法等。机器人动力学研究的是机器人的运动和作用力之间的关系。机器人的动力学问题包括动力学正问题和动力学逆问题。动力学正问题是对于给定的关节驱动力......

rouyu308的博客 9500

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 241

hibernate.default_schema配置

${hibernate.dialect} ${hibernate.dialect} true true 50 30 org.hibernate.cache.EhCacheProvider false false false SCOTT 此处hiberna...

梦舞芳华 2997

新手秒变高手:使用一键脚本快速安装OpenClaw并完成初始化配置

一键脚本是一种自动化工具,可以帮助用户快速完成软件的安装和配置过程,无需手动执行繁琐的命令。OpenClaw提供了官方的一键安装脚本,让新手用户也能轻松部署OpenClaw。

一键难忘的博客 359

springboot+jpa动态指定schema

jpa根据实体类创建数据库表时,@Table(schema=""),schema默认是"",可以通过该属性指定schema,但是在开发或者生产环境下可能需要切换schema,总不能去每个实体类上一一修改schema属性的值,可以在springboot的配置文件中增加如下配置,实现动态指定schema,而无需在实体类上加schema spring.jpa.properties.hibernate.default_schema=XXXX ...

howcsdn的博客 3794

CGAL 网格等高线计算

CGAL 网格等高线计算

dayuhaitang1的博客 452

团体程序设计天梯赛竞赛题--登顶题【L3-034 超能力者大赛】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 724

EFCore动态切换Schema

最近做个分库分表项目,用到schema的切换感觉还是有些坑的,在此分享下。 先简要说下我们的分库分表 分库分表规则 我定的规则是,订单号(数字)除以16,得出的结果为这个订单所在的数据库,然后他的余数代表他所在这个库里面的哪个表。 然后在一个库里面有16个表,这个怎么实现呢?比较龊的办法是 Order1/Order2这样,不过后来我想了下,数据库默认(我们是Sql Server)是有...

weixin_30549175的博客 770

Android UI 组件系列(二):Button 进阶用法

在这篇博客中,我们深入探讨了 Button 的进阶用法,重点介绍了如何通过 事件处理 来响应用户的操作,如何使用 自定义样式 来提升按钮的外观,并利用 StateListDrawable 来管理按钮在不同状态下的表现。这些技巧能够帮助你打造更具交互性、视觉吸引力和动态响应的按钮,提升用户体验。

weixin_39339407的博客 1625

java 动态schema_在hibernate中动态切换Schema

/p>"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">上面的代码部分,就指定了Schema.如果在操作的时候想切换Schema.操作如下:默认的配置POI_BEIJING上面的映射文件改为:/p>"http://hibernate.sourceforge.net/hibernate-mapping-3.0....

weixin_35326667的博客 675

从零构建简历智能匹配系统:AI技术助力高效招聘

本文详细介绍了简历智能匹配系统的开发过程,从数据收集、预处理、特征提取到模型匹配和结果展示,每一步都提供了详细的代码实例。通过使用TF-IDF、Word2Vec和BERT等技术,我们能够有效地将求职者的简历与职位描述进行匹配,从而提高招聘效率。未来,随着自然语言处理技术的进一步发展,简历智能匹配系统将变得更加智能和高效,为企业和求职者提供更好的服务。

理论都是虚的,代码才是王道。 310

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

hibernate mysql schema指什么意思_Hibernate 映射 schema简析(异常:Missing column)

Hibernate有很多值得学习的地方,这里我们主要介绍Hibernateschema,包括介绍切换Schema等方面。Hibernateschema如果你在调用Hibernate的时候需要切换schema怎么办呢。在oracle中,不同的用户,使用不同的schema.在Hibernate的POJO中,会指定了schemaencoding="utf-8"?>/p>PUBLIC "-//...

weixin_31328141的博客 377

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

hibernate实现动态访问数据库

需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的schema做操作。比如,如果当前处理的是A公司,那么向SchemaA 里面保存数据,如果当前处理的是B公司的,则向SchemaB里面保存数据。其实就是一套程序,实现后台的动态切换。我这里提供几种方法,大家自己根据情况考虑,都能实现,注意是实现,不一定适合于正式应用。方法一: 在Hibernate里面,有一...

程序人生 296

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【springmvc+hibernate】动态切换数据源实现多租户数据分离

需求 我们为客户开发了移动端应用,基于数据安全性的考虑,需要将业务数据按照数据库隔离的方式进行设计。 数据库架构 数据库设计说明 master数据库用于基础数据的管理和综合业务查询 – 基础数据包括:用户、角色、权限等 —主要负责,你是谁,你从哪来,你要去哪的问题 –综合业务查询 —主要是通过视图的方式,将多个业务数据库中的数据进行整合 hx和rl为各自的业务数据库 开发流程 解决问题 1. aop切片不生效,配置后无法动态的切换数据库 其原因在于系统中使用了spring和springmvc

柠檬加冰 565

Java多租户数据隔离到底该用Schema还是Shared-DB?3大主流模式实测吞吐量、扩展性与运维成本全对比

深度解析Java多租户数据隔离配置难题,对比Schema、Shared-DB与Shared-Table三大主流模式。实测吞吐量、横向扩展性与DBA运维成本,明确各模式适用场景与落地建议。兼顾安全性、性能与可维护性,值得收藏。

BytePulse的博客 384

Hibernate多租户架构实现与优化实践

多租户技术是SaaS应用实现数据隔离的核心方案,通过共享基础设施为不同租户提供服务。其实现原理主要依赖数据库层的隔离机制,包括独立数据库、Schema隔离和共享表三种模式。Hibernate作为Java主流ORM框架,从5.0版本开始原生支持多租户架构,通过MultiTenantConnectionProvider和CurrentTenantIdentifierResolver等核心组件实现租户上下文管理。在性能优化方面,需要特别注意连接池管理、二级缓存隔离和批量处理策略。该技术广泛应用于金融、医疗等对数据

weixin_30074763的博客 197

Spring+Hibernate实现动态SessionFactory切换(改进版)

前面写了一篇关于动态切换Hibernate SessionFactory的文章 发现存在一些问题: 需要配置多个HibernateTransactionManager和多个Spring 切面 这样带来两个问题 1. 程序效率降低,因为Spring进行多次Advice的拦截 2. 如果其中一个SessionFactory连接出现问题,会导致整个系统无法工作 今天研究...

weixin_30449239的博客 144
上一篇: Discuz论坛网站不显示Google的AdSense广告的原因和解决方法,
下一篇: 期待优快云论坛Java技术版下午的小版块调整,感谢大家的支持
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值