hibernate - 如何使用 JPA 编写生产者-消费者

标签 hibernate jakarta-ee jpa producer-consumer

目前我有一个用于某种任务的 JPA 实体。一些进程写入该表,并且计划进程处理该任务,并在准备好时更改状态。我需要对任务进行优先级排序,并在失败时以降低的频率重试。我的环境是 GlassFish 3 + JPA 通过 Hibernate + MySQL + XA 事务。在中期,该项目将用 Spring 解决方案(使用 Jetty 左右)替换 GlassFish。

它以某种方式工作,但我对此并不满意:我得到 OptimisticLockExceptions,看起来我在某些时候没有正确处理事务,如果您需要可变时间,GlassFish 上的 JPA 计时器也有点困惑.

我有一种感觉,我在这里使用了错误的工具,我应该使用一些成熟、稳定的设计,而不是一些混在一起的东西。使用 JPA 实体似乎是重量级的,但原始 JDBC 看起来是一个更糟糕的选择。当然,我想避免对库的严重依赖,但也许我忽略了针对我的特定问题的简单“ jar 头”解决方案(这似乎并不那么不寻常)。

[编辑]

为了澄清:我不会改变用例(我什至没有代码了),我只是想获得一些通用指南,以便下次“做对”(TM)。回答来自 ben75 的问题:worker 可能是多线程的,我需要小事务,因为它应该一直运行 - 可能持续数月。

最佳答案

我认为你只需要尝试从上面看事情,以便识别流程中的角色并检测任务创建者、任务处理器和优先级 Controller 之间的依赖关系。之后,为这些角色中的每一个设计清理可重用的 EJB/服务。

有时,对于只需要 10-20 秒的相对较短的任务,强制用户等待更有意义,使用异步 EJB(搜索 @Asynchronous),而不是创建任务。

关于 OptimisticLockExpcetions:这些可能是因为数据同时发生变化,这可能是由任务消费者的其他线程之一引起的,也可能是由更改数据的客户端引起的。确定原因,如果是第一种情况,则更正错误。当然,如果您提供一些有关一切工作方式的代码或解释,您将获得更多帮助。

处理任务时:我会使用悲观锁获取任务实体,以便另一个线程不会开始处理相同的任务。

所以我想你的过程很复杂,你需要一个更好/更灵活的设计。

关于hibernate - 如何使用 JPA 编写生产者-消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162949/

相关文章:

java - 为什么 hibernate 尝试获取多个连接?

java - 在总线上创建到安全消息传递引擎的连接时,Websphere 仍然抛出“未指定用户”

jakarta-ee - 事件溯源 : handle event schema changing

java - 将 JPA Criteria Builder 与表连接结合使用

java - 在 JPA 中只获取父对象数据

spring - 在 apache tomcat 6.0.14 中使用 spring 3 最新源代码

java - JPA 加入聚合函数

java - 在 hql 中将结果集从 int 转换为 boolean

java - 无法创建与 hsqldb 的可池连接

jakarta-ee - Maven在pom中下载未指定的jar文件