领略架构之美:tomcat 连接池 tomee 数据源 jta 支持 详细架构剖析

tomee-cli:配置 Apache TomEE 的快速方法 Apache TomEE-CLI 此命令行工具可帮助系统管理员和开发人员管理 TomEE 服务器实例。 安装 按照以下步骤安装 TomEE-CLI: 安装和配置 。 安装和配置 。 安装和配置 。 创建指向 TomEE 安装目录的环境变量TOMEE_HOME 。 它是可选的,但它大大简化了 TomEE-CLI 的使用。 如果没有它,每次调用函数时都必须通知安装路径。 在本地克隆存储库: $ git clone 它将在当前位置创建目录tomee-cli 。 格纹 要在 TomEE-CLI 中检查代码样式,请在目录中输入并运行: $ lein cljfmt check 要修复代码样式运行: $ lein cljfmt fix 测试 要在 TomEE-CLI 中运行测试,请输入目录并运行: $ lein test 执行 要运行 TomEE-CLI,请进入目录并启动 R 立即下载

连接池核心机制


ProxyConnection:

最底部一个代理,负责:
1.路由xa和非xa的方法到正确的真实数据库上;
2.调用close方法之后将逻辑池化的逻辑连接对象放回池中;
3.在close之后拦截继续对真实连接的调用;
4.其它池化逻辑支持...


DisposableConnectionFacade:

最头部的一个代理,负责:
在调用close方法之后,切断该对象到后面各层代理的引用,好处是可以避免继续反射使用池中的资源以造成管理混乱,同时可以使得相应的资源得以及时被GC

动态代理:
根据真实数据库连接是否是 XA 的,选择创建出 XAConnection 或者 Connection 接口的动态代理对象,代理的执行对象正是最头部的代理:DisposableConnectionFacade
如此:客户端默认拿到一个 Connection 类型的连接后,可以根据实际情况 强制转换 为XAConnection,之所以可以转换成功,是因为在创建这个代理对象之初根据真实的xa连接选用了 XAConnection 接口,
最后的调用都会路由到 ProxyConnection,它会选择将xa的操作交由真实的 xa 连接来执行。


对外数据源接口设计


pool.DataSourceProxy:

注意:DataSourceProxy 即没有实现 JDK 标准的 DataSource 接口,也没有实现 JDK 标准的 XADataSource 接口,在从它的 getConnection 方法或者 getXAConnection 方法获取连接的时候都是是从 ConnectionPool 中获取后强制转换得到的,由“连接池核心机制”可得知“确实可以转换成功”!
注意:其子类 pool.DataSource 和 pool.XADataSource 并没有实质的逻辑实现,只是自己实现了标准的 JDK 接口,这样做的目的就是可以让客户端强制转换为所需要的 JDK 标准接口 DataSource 或者 XADataSource,也就是给客户开放标准接口,这样做的好处是可以兼容不同版本的jdk,比如新版本的添加了新的接口,pool.DataSourceProxy 也已经实现了,但是使用的旧版本的 JDK 无法编译,所以只能 抹去 新版本 JDK 接口的声明(比如抹去 @Override、extends、implements 等),然后在不同的子类中去开放这些接口,注意这里 子类要单独使用高版本 JDK 编译(因为要依赖高版本的api),这样的子类不用写任何具体的方法实现,主要声明一下自己是高版本的类型就可以了,具体的实现 父类已经都做过了(只不过没有暴漏类型而已)。


Tomee数据源扩展



Tomee数据源的创建是通过 DataSourceFactory 这个控制类结合数据源建造器 TomEEDataSourceCreator 来实现的,DataSourceFactory 控制构造的类型,比如是否需要 pool,是否需要 jta 等,TomEEDataSourceCreator 来完成具体的工作,而具体的操作就是对 tomcat 连接池进行扩展,主要是扩展 pool.DataSource 类和 ConnectionPool 类等。
TomEEDataSource:是对tomcat连接池的简单封装;
ManagedDataSource:则是对 TomEEDataSource 再次封装,目的是添加 JTA 职责,它是通过拦截创建连接方法来完成的,对创建出的连接进行了 JTA 业务栈包装,包装后的代理为:ManagedConnection(它是一个业务栈代理,并不是一个标准的 JDK Connection 类型的对象)


ManagedDataSource ManagedConnection :

ManagedDataSource 是 TomEEDataSource 的一个代理,其职责在于从TomEEDataSource中获取连接后对其进行 jta 逻辑包装,这些包装是通过 ManagedConnection 这个 连接代理来完成的,连接代理的逻辑:在调用连接相关的事务性方法前将当前的 xa resource 加入到当前 JTA 事务。


TomEEDataSource TomEEConnectionPool:

TomEEDataSource(继承自pool.DataSource),TomEEDataSource添加了自己的封装逻辑:
1.动态代理实现不允许父类对配置进行修改;
2.注册和解注册 jmx;
3.如果是数据源创建则使用tomcat-pool自己的连接池,如果是驱动创建则换成使用TomEEConnectionPool(继承自tomcat-pool,主要增强的逻辑是在建立PooledConnection的时候每次都改用尽量使用tomcat自己的类加载器来加载driver实现类)


ManagedConnection:

=== JTA 逻辑 ===
1.根据调用的Connection的方法名称,决定是否进行 JTA 逻辑,不需要则直接交给真实连接执行;
2.若上述判断需要 JTA 逻辑,则获取当前线程 JTA 事务,如果没有获取到则说明当前无事务,则直接交给真实连接执行;
3.到这里说明当前线程存在全局事务,进而先检查下该代理连接上是否已经绑定过事务,如果已经绑定过,且事务仍然处于活跃状态,且绑定的事务与当前线程事务一致,则直接在事务模式下代理执行方法,如果绑定的事务与当前线程事务不一致则抛出"该连接已经加入到其它事务"的异常;
4.若当前没有绑定事务,或者事务不处于活跃状态(已提交或回滚等),则继续检查当前线程事务是否处于活跃状态,不活跃则直接交给真实连接执行,否则进行 JTA 逻辑封装;
5.JTA 逻辑封装,首先在当前事务上检查该数据源是否已经绑定过 JTA 连接,如果绑定了则直接使用(比如是在一个ejb中进入 其它ejb,或第二次从池中 get 到一个连接,但都在同一个事务里)不再加入新的事务分支。
6.如果该数据源是第一次来加入事务(即没有在当前事务上找到该数据源的绑定连接),则获取到真实数据库的 XAResource,并通过 transaction.enlistResource 加入到当前事务,加入成功后则将当前数据源绑定到当前事务(下次如果是同一个数据源就还使用同一个连接,而不是新建立事务分支,这样即可以提高性能也可以避免一些问题:如oracle一个xa连接为关闭或者其对应的XAResource没有end,则不能使用另一个xa连接的XAResource来提交前一个xa连接的事务id),最后,向事务中注册同步逻辑(JTA规范):在事务结束后调用真实数据库连接的close方法(其实这里的真实数据库连接也只是一个代理,只是调用方并不关系);
7.另外,请注意:Tomee的JTA逻辑允许底层数据不是 XA 类型的,对于非 XA类型的数据源创建出来的连接进行了本地形式化的封装,即“LocalXAResource”,LocalXAResource表面上和标准 JTA XAResource提供了相同的接口,可以遵循 JTA 事务管理器的调度,但并没有真实地实现 XA 规范,在两阶段提交出错后不能保证数据的一致性,所以应该尽量保证参与 JTA 的数据源都是真实的 XA 数据源。



PS:以上分析源自 Apache 开源社区 Tomee Tomcat 源码,tomcat:8.5.6 版本 和 tomee:7.0.2 版本,其它版本的也没有太大变化。


workbench拓扑优化教程_拓扑优化实例-轮毂的优化 拓扑优化实例-轮毂的优化ANSYS Workbench的新版本集成了topology optimization模块,为用户的拓扑优化提供的很好的应用。通过拓扑优化topology optimization模块的使用可以对拓扑有较好的理解,该模块拓扑优化可以简单概括为一句话:如何在合适的位置去除确定的材料使用量,而相应的刚度变化影响最小。本例以汽车轮毂为例,来确定轮毂的辐条形状。1.建立模型DM中可... 阅读详情

相关推荐

CCS安装教程图解说明:可视化步骤快速上手

通过清晰的图解步骤详解CCS安装过程,帮助新手快速掌握环境搭建。结合ccs安装教程与实际操作界面,每一步都直观易懂,大幅降低学习门槛,提升配置效率。

weixin_42611310的博客 962

TomEE 入门指导

介绍 Apache TomEE(音tommy), 多么熟悉的名字呀!不错,它是Tomcat的变身,融合JavaEE之特性而成: TomEE = Tomcat + java EE 。那么,它有何与众不同之处呢? 众多应用服务器使用 Tomcat 提供的 servlet 功能。 这是个不错的选择,Tomcat是一款优秀的 servlet 容器。与其它应用服务器相

smmgd的专栏 1万+

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5076

TomEE入门指南(权威指南)附实例

Apache TomEE 入门指南 介绍 Apache TomEE(发音同“tommy”)是一个新的JavaEE服务器,由Apache软件基金会开发,你大概能够从它的名字猜到,它是从Tomcat而来,同时加入的JavaEE的特征:TomEE=Tomcat+java EE。因此,它与其他的应用服务器有什么不同呢? 有一些应用服务器是使用Tomcat提供的servlet功能,这不是什么坏事——T...

qq_35303585的博客 6787

RC滤波电路工作原理:【带图+公式计算】

容抗Xc和电容C成反比,和频率f也成反比,C越大,交流电容易通过电容,说明电容量大,电容的阻碍作用小;交流电的频率高,交流电也容易通过电容,说明频率高,电容的阻碍作用也小。我们可以看到,一个2V的纹波,经常RC电路后,幅值下降到mv级别,基本可以忽略不计,这就是RC滤波电路的工作原理。一个频率为1Khz的信号,通过一个容值为0.1uf的电容,计算电容对该信号产生的阻抗。将RC滤波器电路中的电阻,取值为1KΩ,电容取值为0.47uf,纹波幅值为2V。从公式1可以看到,Xc越大,Vout值就越接近Vin的值。

weixin_66299220的博客 2万+

Android AudioFlinger(一)——初识AndroidAudio Flinger

AudioFlinger 是 Android 系统中的音频中间层(audio HAL, Audio Hardware Abstraction Layer)的一部分,负责管理音频的混音、播放和音量控制等功能。它充当 Android 应用程序和音频硬件之间的桥梁。

hirezy 1666

tomee 创建 xa 数据源 并 支持 JTA 事务

如果要在 tomee 中使用 jta 事务,就不能用 tomcat 数据源配置(http://blog.youkuaiyun.com/conquer0715/article/details/77983379) 里面的配置方式,需要如下使用: 打开 conf/tomee.xml 文件,添加如下配置: <!-- jdbcDriver = oracle.jdbc.driver.OracleDri

王鹏亮 的专栏 3676

(四) OpenClaw-Skill技能全面了解和自定义技能

OpenClaw Skills是提升AI代理功能性的关键模块。本文系统介绍了Skills的核心概念、获取渠道和创建方法。Skills作为标准化指令集合,能让OpenClaw从单纯理解升级为实际执行任务,相比传统System Prompt具有模块化、可复用等优势。用户可通过Clawhub官方商店、GitHub社区等渠道获取5700+现成技能,或按需开发自定义Skill。文章详细演示了创建"Hello World"示例技能的完整流程,包括编写Python脚本、配置SKILL.md文件、部署。

直到世界的尽头 8294

Tomee数据源的配置方式

TomEE Philosophy Apache TomEE, pronounced "Tommy", is an all-Apache Java EE 6 Web Profile certified stack where Tomcat is top dog. Apache TomEE is assembled from a vanilla Apache Tomcat zip file...

java 技术交流。 2725

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 174

点到面点云配准(Point To Plane)算法知识详解和详细推导,C++代码实现

点到面 ICP (Iterative Closest Point) 是在 3D 点云配准中常见的一种变体,通过最小化点到对应面(由法向量定义的局部平面)的距离来提高收敛速度和精度。

qq_36812406的博客 1809

Apache发布TomEE 7.1,支持Java 8和MicroProfile 1.2

Apache TomEE社区发布了TomEE 7.1,这是一个重大的升级,提供了Java SE 8和MicroProfile 1.2支持。历史2011年,David Blevins当时受雇于IBM,领导一个志愿者团队创建了TomEE,一个“Tomcat”和“JavaEE”组成的复合产品,并在JavaOne 2011大会上进行了发布。TomEE 包含OpenWebBeans、OpenEJB和Open...

weixin_34049948的博客 311

运放单电源供电和双电源供电的实际应用案例

文章摘要:本文对比分析了运放单电源与双电源供电的典型应用场景及电路设计要点。单电源供电适用于低成本、小体积设备,如便携音箱(5V供电+中点偏置)、工业4-20mA信号转换(12V供电+电压跟随)和物联网传感器(3.3V低功耗设计);双电源供电则适合高精度要求场景,如Hi-Fi音响(±15V对称输出)、医疗设备(±5V微弱信号放大)和精密仪器(±15V宽动态范围)。文末提供常见运放选型对照表,涵盖LM324、TL082等型号的供电参数与核心特性,为不同应用场景提供选型参考。(149字)

qq_37999850的博客 608

Nginx、apache、tomcat、jboss、tomee的区别

定义: Nginx:是高性能的http及反向代理服务器,也是一个邮件代理服务器(SMTP/IMAP/POP3); apache:是web服务器,用来提供http服务,以及虚拟主机、URL转发等,自身支持静态解析,适合静态HTML、图片等,可通过拓展脚本、模块支持动态页面; tomcat:是一个java应用服务器,只是一个servlet容器,动态请求解析器,可认为是apache的拓展,也可独立运行,可以处理动态请求; jobss:是一个运行EJB的j2ee应用服务器,tomcat被以内嵌的方式集成到jboss

qq_44207101的博客 1293

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Tomee中的EJB容器远程调用

Tomee中EJB容器远程调用

杂记。 1372

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA:TomEE 主目录/基目录出错

错误分析:创建Tomcat项目时,错误地创建了TomcatEE项目,重新创建即可。

yuboyao1012的博客 1175

Apache TomEE(和Tomcat)的自签名证书

可能在大多数Java EE项目中,您将拥有具有SSL支持( https )的部分或整个系统,因此浏览器和服务器可以通过安全连接进行通信。 这意味着在处理数据之前,已发送的数据已加密,传输并最终解密。 问题在于,有时官方的“密钥库”仅可用于生产环境,而不能在开发/测试机器中使用。 然后,一个可能的步骤是由团队的一个成员创建一个非官方的“密钥库” ,并将其共享给所有成员,以便每个人都可以使...

最佳 Java 编程 424

Tomcat运行项目时报错 Error running ‘TomEE 9.0.65‘ The selected directory is not a TomEE home 怎么回事?怎么解决?

在配置Tomcat时选中的TomEE Serve 而不是TomcatServer 导致无法运行项目,因为你运行的是TomEE Server 而不是你配置的Tomcat Server 导致无法识别版本和运行。重新配置Tomcat.在配置时选中Tomcat Server ,然后重启项目,即可成功运行。

weixin_71108480的博客 2762

linux 8e,Apache TomEE 8.0达到了第一个里程碑

该社区11月宣布,最新版本的Apache TomEE应用服务器TomEE 8.0已达到里程碑1(M1)状态。新版本是一个重大更新,将是第一个为Java EE 8和Eclipse Jakarta EE提供支持的版本。在其他更改中,8.0版引入了对两个新规范的支持:JSON-B,一个用于将Java对象转换为JSON(JavaScript Object Notation)消息的标准绑定层;以及Java ...

weixin_39562185的博客 280

DockerHub上最受欢迎的151个官方镜像,相传掌握第17个可以主宰宇宙!

上周闲得无聊逛了逛dockerhub上的镜像,发现好多东西自己都不认识,深感自己将被时代遗弃,遂将这些镜像包挨个百度了个遍,将他们的简介摘录下来,日夜苦读,以便日后出去和人吹牛逼。 大部分简介都是直接百度百科上复制下来的,后面的一些中文资料比较少,直接用谷歌翻译的DockerImage的简介,主要就是为了大体明白一些东西都是干啥的,具体细节莫要在意。 1、nginx(9.5K STARS,10M+ PULL)Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/PO.

woldy的专栏 4万+

数据库批量插入和存在的问题

mysql批量操作和注意事项

huhu123444的博客 1239

tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

tomee 警告:我不是Spring Boot的专家。 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作。 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前,我开始收到很多有关博客文章,推文和有关Spring Boot信息的链接。 在他的网站上,您可以阅读: 通过Spring Boot,可以轻松地创建独立的...

最佳 Java 编程 291

微服务系列:MicroProfile和Apache TomEE

介绍 MicroProfile是一项由知名供应商于2016年9月发起的举措,目的是基于JEE平台构建微服务架构。 任务是针对微服务架构优化Enterprise Java 。 开发人员可以利用这种体系结构,通过Enterprise Java平台以标准化的方式构建和开发微服务应用程序。 API构建将成为JCP程序的一部分。 MicroProfile当前基于最小占用空间技术堆栈构建,该技术堆栈...

最佳 Java 编程 322

java的开发工具e,TomEE:Tomcat+Java EE

Apache TomEE(发音为”Tommy“)是一个通过Java EE 6 Web Profile认证的全功能Apache容器,其中Apache Tomcat是组合的中间力量。Apache TomEE从一个普通的Apache Tomcat压缩包上编译而来。我们可以从Apache Tomcat开始,增加我们的jar文件然后打包。结果就得到的Tomcat具有了JavaEE功能——TomEE。TomE...

weixin_32353247的博客 614

浅谈Servlet、Tomcat

威哥要开始Jsp之旅了,开始学习Java的web编程。在这里和大家一起简单理解下Jsp涉及到2个重要概念:Servlet、Tomcat。 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 狭义的Servlet是指Java语言...

xuwei_net的专栏 920

tomcat tomee 配置 数据源 (含 XA 数据源)

1.普通数据源(javax.sql.DataSource) 在 context.xml 中,添加如下内容即可完成数据源创建: <Resource name="ctx_not_xa" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" type="javax.sql.DataSource"

王鹏亮 的专栏 5126

推荐使用apache Tomee做开发分布式应用服务器

主要由Apache Tomcat、Apache OpenWebBeans、Apache MyFaces、Apache ActiveMQ、Apache OpenJPA和Apache CXF组成。 下载地址:http://mirror.esocc.com/apache/tomee/tomee-1.5.2/apache-tomee-1.5.2-plus.zip        Apache

Mr.稻 帅(梦想如歌!) 2757
上一篇: tomee 创建 xa 数据源 并 支持 JTA 事务
下一篇: Tomcat 支持 shell 脚本运行(CGI)
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值