2016-04-28 31 views
0

我上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請求設置的)不會被釋放?

回答

0

嗯,我不知道,但我不希望看到其他服務直接使用@Stateless會話bean。從我見過的所有野蠻例子中,我都會看到@Stateless會話bean被注入到REST服務中。請參閱:

MemberResourceRESTService.java

另外,請記住,我已經習慣了看到的例子是Java EE的/ JPA的例子,像一個參考,而不是Hibernate的例子。不過,據我所知,他們正在研究廢棄Hibernate API並轉向JPA api。

Is legacy Criteria API still recommended?

+0

謝謝你,我重構我的API使得'@ Stateless'的DAO,並將其注入到REST服務。 –