eclipselink_Java EE 7的高峰– EclipseLink的多租户示例

eclipselink

水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith( 博客 / 推特 )获取了有关EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能,这些功能将与June Eclipse Juno发行版一起提供。 详细来说,它们是REST,NoSQL和Multitenancy。 (详细信息请参阅marsjug事件中的完整幻灯片(PDF) 。)

我喜欢看到EclipseLink仍然是Java持久性创新的中心,并且他们正在努力及时采用最新的动态更新。 总的来说,我在一个较为保守的行业工作,我主要寻找的新功能是多租户。 您可以从幻灯片中猜测,该字段中的某些内容应该已经可以与最新的EclipseLink 2.3.0一起使用。

多租户将是什么样子?
让我们开始看什么Oracle的琳达DeMichiel在过去几年的JavaOne(对比宣布博客-后 ),也让我们了解一下什么的早期草案(PDF)的JPA 2.1规范所提供的。 较容易的部分是早期草案。 在任何情况下,没有一行提到“ Multitenan [t | cy]”。 因此,对于进一步的迭代来说,这显然仍然是一件大事。 在JavaOne策略主题演讲 (幻灯片41,42)和JavaOne技术主题演讲(PDF) (幻灯片25)中可以找到更多信息。 通用Java EE 7方法将为不同租户支持同一应用程序的单独隔离实例。 映射应由容器完成,并以某种方式可供应用程序使用。 直到今天,这都是非常模糊的,幻灯片中唯一可用的具体代码示例使用两个注释@Multitenant和@TenantDiscriminatorColumn引用了一些明显的JPA相关示例。 嗯 这看起来对您不熟悉吗?

今天有什么可能?
是的! EclipseLink(从2.​​3.0版开始-Indigo)使用承租人区分符列支持共享的多承租人表,从而允许将应用程序重新用于多个承租人并将其所有数据放置在一起。 所有租户共享相同的架构而彼此之间不知道,并且可以照常使用非多租户实体类型。 但是请注意,这只是数据多租户的一种可能方法。 这通常称为“专用数据库”,因为所有租户的数据都进入一个单独的数据库中! 以下是基本原则:
–应用程序实例处理多个租户 – JPA必须隔离每个租户的缓存 您可以在专用的EclipseLink Wiki页面上查看所有详细信息。 想要试驾吗? 开始吧。 像往常一样先决条件(NetBeans,GlassFish,MySQL,如果需要更多帮助,请比较旧文章。)。 确保具有正确的EclipseLink依赖项(至少2.3.0)! 通过向导创建一个新实体,设置数据源和persistence.xml并将其命名为“客户”。

@Entity
public class Customer implements Serializable {
//...
}

如果启动应用程序,则会看到EclipseLink在数据库中创建类似这样的内容。

让我们使其成为一个多租户实体。 添加以下注释:

@Entity
@Multitenant
@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code")
public class Customer implements Serializable {
//...
}

有多种用法选项可用于如何在具有@Multitenant实体类型的应用程序中使用EclipseLink JPA持久性单元。 由于不同的租户将只能访问其行,因此必须配置持久层,以使来自不同租户的实体不会出现在同一缓存中。 如果您比较详细的方法(专用PC,每个租户PC,每个租户PU),您会发现,到今天为止,对于PC或PU的容器管理注入,您最终有两个可能的选择。 让我们首先尝试最简单的方法。

专用持久性单元
在这种用法中,每个租户都定义了一个持久性单元,应用程序/容器必须为其租户请求正确的PersistenceContext或PersistenceUnit。 只有一个持久性单元,没有共享的内容。 继续上面的示例,然后将以下属性添加到persistence.xml中:

<property name="company-tenant.code" value="TENANT1" />

试试看,比较表。

如您所见,您现在有了companyId列。 如果插入一些数据,它将始终被在persistence.xml中分配的属性值填充。 使用@PersistenceContext或@PersistenceUnit访问您的实体。 使用这种方法,您可以像平常一样为应用程序共享一个缓存。

具有共享缓存的@PersistenceContext(来源:S.Smith)

每个租户的持久性上下文
如果您不想每个应用程序只有一个租户,则可以决定在persistence.xml中具有一个持久性单元定义,并在应用程序中具有一个共享的持久性单元(EntityManagerFactory和缓存)。 在这种情况下,需要在运行时为每个EntityManager指定承租人上下文。 在这种情况下,您具有可用于常规实体类型的共享缓存,但是@Multitenant类型必须在缓存中受到保护。 您可以通过指定一些属性来做到这一点:

@PersistenceUnit
EntityManagerFactory emf;
Map props = new HashMap();
props.put("company-tenant.code", "TENANT2");
props.put(PersistenceUnitProperties.MULTITENANT_SHARED_EMF, true);
EntityManager em = emf.createEntityManager(props);
每个租户共享@PersistenceUnit(来源:S.Smith)

鉴别方法
上面的示例使用单个区分符租户列。 您可以通过指定primaryKey属性,将discriminator列添加到PK,如下所示:

@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code", primaryKey = true)

如果执行以下操作,则也可能使用多个表使用多个租户区分符列:

@Entity
@SecondaryTable(name = "TENANTS")
@Multitenant
@TenantDiscriminatorColumns({@TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "company-tenant.id", length = 20, primaryKey = true),@TenantDiscriminatorColumn(name = "TENANT_CODE", contextProperty = "company-tenant.code", discriminatorType = DiscriminatorType.STRING, table = "TENANTS")
})

这将导致辅助租户表。

其他物品
与往常一样,您也只能在persistence.xml中进行完整的配置。 作为参考,请查看已经提到的Wiki页面。 最后一件事很有趣。 您也可以将“租户区分符”列与您的实体对应。 您只需确保未更新或插入它即可。

@Basic@Column(name = "TENANT_ID", insertable = false, updatable = false)private int tenantId;public int getTenantId() {return tenantId;}

查看调试输出,您可以了解幕后情况:

INFO:获取EntityManager
INFO:插入测试客户
FEIN:插入客户(ID,TENANT_ID)值(?,?) 绑定=> [1,2] FEIN:插入租户(ID,TENANT_CODE)的值(?,?) 绑定=> [1,TENANT2] FEIN:从客户t0,租户t1中选择t0.ID,t1.TENANT_CODE,t0.TENANT_ID,t1.ID(((t1.ID = t0.ID)和(t1.TENANT_CODE =?))和(t0.TENANT_ID =?)) 绑定=> [TENANT2,2]

是否对更多Java EE 7和JPA 2.1好东西感兴趣? 使用EclipseLink JPA 2.1项目的开发状态Wiki页面保持更新。

参考: Java EE 7的最高峰–来自我们JCG合作伙伴的 EclipseLink的多租户示例   Markus Eisele在使用Java的企业软件开发博客上。


翻译自: https://www.javacodegeeks.com/2012/02/sneak-peak-at-java-ee-7-multitenant.html

eclipselink

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于一些常见智柜问题的分析及解决办法

竟然还有小伙伴感觉自研项目不好的小伙伴&#xff1f;渐渐感觉不管是在小公司或者在大公司&#xff0c;能有一个值得奋斗的远方就可以了&#xff0c;比如薪资高&#xff0c;钱多事少离家近&#xff0c;自己真的对自己目前做的事情感兴趣&#xff0c;否则干啥都感觉没劲&#xf…

流绩效–您的想法

上周&#xff0c;我介绍了一些有关Java 8流性能的基准测试结果。 你们和gal足够感兴趣&#xff0c;可以留下一些想法&#xff0c;还有哪些可以介绍。 这就是我所做的&#xff0c;这是结果。 总览 最后一篇文章的序言也适用于此。 阅读它&#xff0c;以找出所有数字为何撒谎&a…

java中JVM的原理

一、java虚拟机的生命周期&#xff1a; Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务&#xff1a;执行Java程序。程序开始执行时他才运行&#xff0c;程序结束时他就停止。你在同一台机器上运行三个程序&#xff0c;就会有 三个运行中的Java虚拟机。 Java虚…

2022将至,前端程序员们应该一起放个烟花庆祝一下,走起

前言&#xff1a;小时候&#xff0c;在我印象中&#xff0c;每到快过年的时候就有很多卖炮仗的&#xff0c;一般也就是阳历的12月份到明年的正月15号卖炮仗的商家比较多&#xff0c;省下买辣条的钱去买炮仗&#xff0c;在老家也就过年和除夕两天及正月15日这几天放烟花和炮仗比…

微信红包封面开放平台序列号

微信红包封面开放平台是一款可以领取微信红包封面的平台&#xff0c;最近网上非常流行好玩的微信红包封面&#xff0c;每一种封面都极具特色&#xff0c;让你的微信红包与众不同&#xff0c;还可以定制专属的微信红包封面&#xff0c;不过名额有限&#xff0c;这边为大家带来这…

ios多线程 -- NSOperation 简介

NSOperation的作⽤&#xff1a;配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤&#xff1a; 1&#xff09;先将需要执行的操作封装到一个NSOperation对象中 2&#xff09;然后将NSOperation对象添加到NSOpera…

在没有复杂插件的情况下从Eclipse启动和调试Tomcat

像Eclipse这样的现代IDE提供了各种插件来简化Web开发。 但是&#xff0c;我相信将Tomcat作为“常规” Java应用程序启动仍然可以提供最佳的调试体验。 大多数时候&#xff0c;这是因为这些工具将Tomcat或任何其他servlet容器作为外部进程启动&#xff0c;然后在其上附加一个远程…

Lucene分析过程指南

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

【javascript高级教程】JavaScript Number 对象

JavaScript 只有一种数字类型。可以使用也可以不使用小数点来书写数字。 var pi3.14; // 使用小数点 var x34; // 不使用小数点 极大或极小的数字可通过科学&#xff08;指数&#xff09;计数法来写&#xff1a; var y123e5; // 12300000 var z123e-5; // 0.0…

【javascript高级教程】JavaScript 字符串(String) 对象

String 对象用于处理已有的字符块。 JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号&#xff1a; var carname"Volvo XC60"; var carnameVolvo XC60; 你使用位置&#xff08;索引&#xff09;可以…

Chrome 开发工具之Network

经常会听到比如"为什么我的js代码没执行啊&#xff1f;","我明明发送了请求&#xff0c;为什么反应&#xff1f;","我这个网站怎么加载的这么慢&#xff1f;"这类的问题&#xff0c;那么问题既然存在&#xff0c;就需要去解决它&#xff0c;需要…

实用常识_实用垃圾收集,第1部分–简介

实用常识这是我打算写的一系列博客文章的第一部分&#xff0c;其目的是解释垃圾回收在现实世界中如何工作&#xff08;尤其是在JVM中 &#xff09;。 我将介绍一些我认为对于充分理解垃圾收集对于实际目的是必需的理论&#xff0c;但是将其降至最低。 其动机是在各种情况下&…

重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

一、平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队&#xff0c;以达到节省开发成本、缩短开发时间&#xff0c;快速适应市…

Java中的堆栈安全递归

在本文中&#xff0c;摘自《 Java中的函数式编程 》一书&#xff0c;我解释了如何使用递归&#xff0c;同时避免了StackOverflow异常的风险。 Corecursion正在使用第一步的输出作为下一步的输入来构成计算步骤。 递归是相同的操作&#xff0c;但是从最后一步开始。 在这种情况…

数字化经营支付3.0有哪些盈利机会

实体商户的现状 服务商经营现状 官方政策支持 微信平台通过多渠道助力商户发放 优惠券,如扫码领券、API领券、支 付有礼、附近3公里等形式,给商户 做引流拓客。

nessus重置密码

许久不用的nessus密码居然忘记了&#xff0c;查了下&#xff1a; cmd下进入到nessus的安装目录 提升为管理员&#xff0c;登录系统 如果想用之前的账号&#xff0c;可以直接在系统内重置密码。转载于:https://www.cnblogs.com/nayu/p/5640527.html

程序员有哪些可以写博客的网站?

俗话说&#xff1a;好记性不如烂笔头&#xff0c;作为一名合格的程序员还是抽时间写写博客的&#xff0c;马云曾说“成功的人有两个特质&#xff0c;一个是喜欢写作&#xff0c;一个是喜欢演讲”&#xff0c;我觉得吧&#xff0c;写作一是为了总结&#xff0c;二是督促自己成长…

工厂方法设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

jmx jolokiaJava监视工具的选择非常广泛&#xff08;由Google提供的随机选择和顺序&#xff09;&#xff1a; javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适用 此外&#xff0c;还有各种专用工具&#xff0c;例如ActiveMQ &#xff0c; JBoss &…

利用 %20 替换 空格

将字符串中的空格都替换为 %20 &#xff08; 时间复杂度为O&#xff08;N&#xff09;的解法 &#xff09; void ReplaceBlankSpace(char* arr){if (arr){int count 0;int lenth strlen(arr);for (int i 0; i < lenth;i)if (arr[i] )count;char*before arrlenth, *beh…