REQUIRES_NEW 内 REQUIRES_NEW 内 REQUIRES_NEW ... 不断

2024-01-17

JBoss 4.x
EJB 3.0

我见过类似以下的代码(大大缩写):

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EJB1 implements IEJB1
{
   @EJB
   private IEJB1 self;

   @EJB 
   private IEJB2 ejb2;

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod1()
   {
     return someMethod2();
   }

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod2()
   {
     return self.someMethod3();
   }

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod3()
   {
     return ejb2.someMethod1();
   }
}

并假设 EJB2 几乎是 EJB1 的精确副本(相同的三个方法),并且EJB2.someMethod3()呼叫EJB3.someMethod1(),然后最终在EJB3.someMethod3()写入数据库。

这是一个人为的示例,但在我们的代码库中看到了与上面类似的代码。该代码实际上运行得很好。

然而,这感觉是一种糟糕的做法,我担心@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)在每个甚至不实际执行任何数据库写入的方法上。这实际上是否每次都会为每个方法调用创建一个新事务,其结果为:

新交易
-新交易
--新交易
---新交易
...(还有很多)
--------新事务(DB写入)

然后在那时解开?这会成为性能问题的原因吗?其他想法?


这实际上每次都会创建一个新交易吗 每个方法调用

不,事实并非如此。仅当从另一个 bean 通过 EJB 引用调用方法时才会创建新事务。调用method2 from method1在同一个 bean 中不会产生新的事务。

也可以看看here https://stackoverflow.com/questions/427452/ejb-transactions-in-local-method-calls and here http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html。后者是一篇非常好的文章,解释了 EJB 中的事务管理。

Edit:
感谢 @korifey 指出,method2 实际上调用了 bean 引用的 method3,从而产生了一个新事务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

REQUIRES_NEW 内 REQUIRES_NEW 内 REQUIRES_NEW ... 不断 的相关文章

随机推荐

  • 在 Swift 中设置带有边距的 UITableViewCell 框架

    我正在尝试制作一个具有左右边距 插图的 UITableViewCell 我过去曾使用 Objective C 使用以下代码完成此操作 void setFrame CGRect frame frame origin x 25 frame si
  • 使用 C++ 11 进行重构

    鉴于 c 提供的新工具集 许多程序员以代码简化 表现力 效率为目标 浏览旧代码并进行调整 有些毫无意义 有些成功 以实现他们的目标 虽然尽量不要在此类工作上浪费太多时间 而只是进行非侵入性且独立的更改 但最佳实践是什么 让我划掉显而易见的部
  • instanceof 检测接口时产生不一致的结果?

    有什么棘手的事情我应该知道吗instanceof 我通过一些方法传递对象列表 并使用以下方法测试这些对象是否实现特定接口instanceof 在某些情况下 instanceof正确地将对象识别为实现接口 但在其他情况下则不然 它似乎在不同地
  • 将日期/时间解析为本地时区

    我正在尝试从服务器端绑定视图持有者解析日期 时间 json 我试图解析的日期字符串是这样的 2018 06 25T08 06 52Z 这是我正在使用的代码 从另一个堆栈溢出线程获取它 try SimpleDateFormat df new
  • Visual Studio 2010 中的 Visual C++ 中的 LNK 2005

    我正在尝试在 MS VS 2010 中编译使用 Visual C 2005 和 MFC 编写的 C 程序 遗憾的是 我在编译过程中遇到以下错误 Error 2 error LNK2005 public virtual thiscall CM
  • 在开发服务器上测试/预览 Github 分支

    我刚刚从 svn 迁移到 github 我和我的团队运行本地测试 并在中央开发服务器上提交更改和测试 每当我们将更改推送到存储库时 我希望自动将对存储库任何分支的更改拉入开发服务器上的文件夹中 这将使我和我的团队能够使用我们的中央开发服务器
  • 如何查询在 Parse 中设置为指向其他表的指针的列的值

    我在用Parse http parse com对于我的应用程序 我想查询一个表 其中的列设置为指向其他表的指针 这是查询 ParseQuery query new ParseQuery CategoryAttribute query whe
  • 将十六进制字符串转换为文本的 NSString?

    我需要将十六进制值的 NSString 转换为文本 ASCII 的 NSString 例如 我需要类似的东西 68 65 78 61 64 65 63 69 6d 61 6c to be hexadecimal 我查看并调整了代码这个线程
  • NHibernate - 查询中的错误列

    我遇到了 NHibernate 的间歇性问题 它生成一个实体的查询 但将其中一个列替换为来自完全不同 且不相关 实体的列 它只替换单个列 并且通常通过重新启动应用程序来解决 尽管有时需要几次尝试 ASP NET 应用程序 NET 4 0 S
  • ASP.NET Web 应用程序文件路径(在 Azure 上发布)

    问题 对于一个学校项目 我创建了一个 REST Web 服务 该服务与一个数据库链接 该数据库从 Excel 文件获取数据 在我的 Migration Configuration cs 类中 我读取了 excel 文件并将它们放入数据库中
  • 如何解决实体映射中的 Grails 错误重复列?在现有的 Postgresql 数据库上

    您好 我在 Grails 中有以下域 class Customer static mapping table customer version is set to false because this isn t available by
  • config.json - 在 ASP.NET vNext 中添加数据库连接字符串

    我正在学习 ASP NET vNext 我需要在 config json 文件中存储两个连接字符串 我如何存储这些 我可以这样做吗 配置 json connectionStrings connection 1 server connecti
  • 在 Python Tkinter 窗口中显示 Google Map API

    大家好 我正在用 Python 开发 Google Map API 我正在使用可以在这里找到的源代码website http pymaps googlecode com svn trunk pymaps py 此代码编译后会生成一个 htm
  • Linux 中有挂起/恢复信号吗?

    我的应用程序需要对休眠模式做出反应 以便它可以在暂停时执行一些操作 在恢复时执行其他操作 我找到了一些特定于分布式的方法来实现它 Upower DBus 但没有找到任何通用的方法 有办法做到吗 Thanks 一个简单的解决方案是使用自管 打
  • 为什么从 Go 1.17 开始 go.mod 中有两个“require”块?

    我创建了一个小型 go 应用程序 几天前我已经从 go 1 15 升级到 1 17 并且我还升级了软件包go get u 更改后 我的 go mod 文件中有 2 个 require 块 为什么 这是什么意思 没问题还是有什么东西坏了 应用
  • preStop 钩子和终止GracePeriodSeconds 之间的关系

    基本上我想做的是研究 Pod 生命周期 并检查我们是否可以在 Pod 终止之前进行一些清理 备份 例如复制日志 我需要的 在终止之前将日志 堆转储从容器复制到 hostPath S3 我尝试过的 我使用了带有 bash 命令的 preSto
  • ajax 中的 Crud 操作不起作用

    在 php 中使用 ajax 我正在尝试执行 CRUD 操作 但不幸的是 我的选择 插入和更新操作不起作用 只有删除才能正常工作 有人可以指导我理解我哪里出了问题吗 以下是我编写的各种文件 home php 主文件
  • 填充python ctypes指针

    我有一个C函数uint8 t begin 它返回一个指向已分配内存的指针 这里有一个ctypes绑定到它 begin mylibrary begin begin argtypes begin restype ctypes POINTER c
  • Ruby 正则表达式键搜索

    http ruby doc org core 1 9 3 Hash html method i include 3F http ruby doc org core 1 9 3 Hash html method i include 3F 是否
  • REQUIRES_NEW 内 REQUIRES_NEW 内 REQUIRES_NEW ... 不断

    JBoss 4 x EJB 3 0 我见过类似以下的代码 大大缩写 Stateless TransactionAttribute TransactionAttributeType NOT SUPPORTED public class EJB