我上WildFly部署了REST API JSON使用JAX-RS(RestEasy的)和JPA(休眠)用Java編寫的10實體JAX-RS +鎖定問題JPA
有時候,一個得到正確的後POST需要幾分鐘才能完成,並且在日誌中會出現幾個警告/錯誤。
下面是一些代碼:
@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
,有時候需要4-6分鐘才能返回n中的JSON,並在日誌中我看到這一點:
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
請求設置的)不會被釋放?
謝謝你,我重構我的API使得'@ Stateless'的DAO,並將其注入到REST服務。 –