2016-04-28 3 views
0

Ich habe in Java unter Verwendung von JAX-RS (Resteasy) und JPA (Hibernate) auf Wildfly 10.Entity Sperr Ausgabe in JAX-RS + JPA

Manchmal eine GET-Recht eine REST-JSON-API geschrieben Einsatz nach Ein POST dauert einige Minuten und ich erhalte mehrere Warnungen/Fehler im Protokoll.

Hier einige Code:

@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); 
    } 

} 

Dann, wenn ich dies tun:

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

ich diesen Ausgang sofort erhalten:

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

und wenn ich ausgeben sofort curl http://localhost/articles/123, manchmal dauert es 4-6 Minuten, um zurückzukehren n die JSON, und in den Protokollen sehe ich:

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 

Erstens: warum es versucht, nur für einen SELECT eine Sperre zu bekommen? Ich denke, die Sperre ist vor Aufruf der EntityManager.find Methode, so wie kann ich die ArticleResource.get Methode annotieren, um den Container anzuweisen, keine Sperre anfordern?

Zweitens: warum die Sperre (die vermutlich von der vorherigen POST Anfrage gesetzt wurde) wird nicht freigegeben, wenn die POST Antwort festgeschrieben ist?

Antwort

0

Nun, ich weiß es nicht, aber ich hätte nicht erwartet, dass die Session-Bean @Stateless direkt vom Rest-Service verwendet wird. Von allen Beispielen für Wildfly, die ich gesehen habe, hätte ich erwartet, dass die Session-Bean @Stateless in den REST-Service injiziert wird. Siehe:

MemberResourceRESTService.java

auch bedenken, dass die Beispiele, die ich gewohnt bin zu sehen, sind Java EE/JPA Beispiele, wie die verwiesen wird, nicht Beispiele Ruhezustand. Ich verstehe jedoch, dass sie daran arbeiten, die Hibernate-API abzulehnen und zur JPA-API zu wechseln.

Is legacy Criteria API still recommended?

+0

Vielen Dank, ich meine API '@ Stateless' DAOs und injizieren sie in die REST-Services machen Refactoring. –