如前所述,JPA <> EJB,它们甚至不相关。EJB 3 恰好利用了 JPA,但仅此而已。我们有很多使用 JPA 的东西,它们甚至无法运行 EJB。
你的问题不是技术,而是你的设计。
或者,我应该说,您的设计几乎不适合任何现代框架。
具体来说,您正试图通过多个 HTTP 请求保持事务处于活动状态。
自然,大多数常见的习惯用法是每个请求本身就是一个或多个事务,而不是每个请求都是更大事务的一部分。
当您在同一讨论中使用术语“无状态”和“事务”时,也会出现明显的混淆,因为事务本质上是有状态的。
您的大问题只是手动管理您的交易。
如果您的事务发生在多个 HTTP 请求上,并且这些 HTTP 请求恰好一个接一个地“非常快”地运行,那么您应该不会遇到任何真正的问题,除非您必须确保您的 HTTP请求使用相同的数据库连接以利用数据库事务工具。
也就是说,简单来说,您获得了与数据库的连接,将其填充到会话中,并确保在事务期间,您的所有 HTTP 请求不仅通过同一个会话,而且以这样的方式实际连接仍然有效。具体来说,我不相信有现成的 JDBC 连接实际上可以在故障转移或从一台机器到另一台机器的负载平衡中幸存下来。
所以,简单地说,如果你想使用数据库事务,你需要确保你使用相同的数据库连接。
现在,如果您的长时间运行的事务中包含“用户交互”,即您启动数据库事务并等待用户“做某事”,那么,很简单,这种设计都是错误的。您不想这样做,因为长期事务,尤其是在交互式环境中,简直就是坏事。就像“过河”一样糟糕。不要这样做。批量事务是不同的,但交互式长寿命事务是不好的。
您希望使您的交互式交易尽可能地短命。
现在,如果您不能确保您将能够为您的事务使用相同的数据库连接,那么恭喜您,您可以实现自己的事务。这意味着您可以设计您的系统和数据流,就好像您在后端没有事务能力一样。
这实质上意味着您将需要提出自己的机制来“提交”您的数据。
做到这一点的一个好方法是您将数据增量构建到单个“事务”文档中,然后将该文档提供给执行大部分实际工作的“保存”例程。就像,您可以在数据库中存储一行,并将其标记为“未保存”。您对所有行执行此操作,最后调用一个例程来遍历您刚刚存储的所有数据,并在单个事务小批处理过程中将其全部标记为“已保存”。
同时,您的所有其他 SQL 都会“忽略”未“保存”的数据。加入一些时间戳并进行收割进程清理(如果你真的想打扰 - 将死行留在数据库中实际上可能更便宜,具体取决于数量),这些死的“未保存”行,因为这些是“未提交的”交易。
它并不像听起来那么糟糕。如果你真的想要一个无状态的环境,这对我来说就是这样,那么你需要做这样的事情。
请注意,在所有这些中,持久性技术确实与它无关。问题是你如何使用你的交易,而不是技术。