【问题标题】:Entity locking issue in JAX-RS + JPAJAX-RS + JPA 中的实体锁定问题
【发布时间】:2016-08-23 12:24:57
【问题描述】:

我部署了一个 REST JSON API,在 WildFly 10 上使用 JAX-RS (RESTeasy) 和 JPA (Hibernate) 用 Ja​​va 编写。

有时,在 POST 之后立即执行 GET 需要几分钟才能完成,并且我在日志中收到多个警告/错误。

这里有一些代码:

@Stateless
@Path("/articles")
public class ArticleResource {

    @PersistenceContext
    private EntityManager em;

    @POST
    @Consumes("application/json")
    public Response post(Article article) {
        this.em.persist(article);
        URI location = UriBuilder.fromUri("/articles/{id}").build(article.getId());
        return Response.created(location).build();
    }

    @GET
    @Path("/{id}")
    @Produces("application/json")
    public Article get(@PathParam("id") Long id) {
       return this.em.find(Article.class, id);
    }

}

那么,如果我这样做:

$ curl -i -X POST --data @article.json http://localhost/articles

我立即得到这个输出:

HTTP/1.1 201 Created
...
Location: http://localhost/articles/123

如果我立即发出 curl http://localhost/articles/123有时返回 JSON 需要 4-6 分钟,在日志中我看到:

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4)
IJ031012: Unable to obtain lock in 60 seconds: org.jboss.jca.adapters.jdbc.local.LocalManagedConnection

首先:为什么它要锁定一个SELECT?我猜想在调用EntityManager.find 方法之前 请求了锁,那么我该如何注释ArticleResource.get 方法以指示容器不要请求锁?

第二:为什么在提交POST 响应时没有释放锁(我想是由先前的POST 请求设置的)?

【问题讨论】:

    标签: hibernate jpa jax-rs wildfly resteasy


    【解决方案1】:

    好吧,我不知道,但我没想到会看到 @Stateless 会话 bean 被其余服务直接使用。从我看到的所有 wildfly 示例中,我都希望看到@Stateless 会话 bean 被注入到 REST 服务中。见:

    MemberResourceRESTService.java

    另外,请记住,我经常看到的示例是 Java EE/JPA 示例,就像引用的示例一样,而不是 Hibernate 示例。但是,我知道他们正在努力弃用 Hibernate API 并转向 JPA api。

    Is legacy Criteria API still recommended?

    【讨论】:

    • 谢谢,我重构了我的 API,制作了 @Stateless DAO 并将它们注入到 REST 服务中。
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多