2009-11-13 5 views
2

J'écris un EJB sans état. J'avais des méthodes comme:Les objets javax.persistence.Query peuvent-ils être mis en cache?

public String getXxx(final String userId) throws ... { 
    final Query query = em.createNativeQuery(...); 
    query.setParameter(1, userId); 
    return (String)query.getSingleResult(); 
} 

Puis-je mettre en cache l'objet de la requête instancier au moment du chargement et de l'utiliser dans un environnement multi-thread?

private static final Query query = em.createNativeQuery(...); 
public String getXxx(final String userId) throws ... { 
    query.setParameter(1, userId); 
    return (String)query.getSingleResult(); 
} 

Merci.

Répondre

1

Non, vous ne pouvez pas. Query est créé par (et références) une EntityManager instance particulière qui est:

  1. pas thread-safe.
  2. Ne doit pas être tenu pendant des périodes prolongées.
1

Je pense que ChssPly76 a raison. Mais vous devriez peut-être regarder NamedQueries. Peut-être que c'est quelque chose dans la direction de votre regard.

0

Cependant, vous pouvez faire en sorte que la chaîne de requête elle-même soit instanciée par une classe. Cela vous permettra d'économiser une nanoseconde ici et là.

Voici un exemple très simplifié (je présente mes excuses pour toute syntaxe ou d'autres erreurs):

private static final String sqlMyQuery = 
    "SELECT stu FROM Student stu " + 
    "WHERE stu.zipCode = ?1 " + 
    "AND stu.status = ?2"; 

public static Student getStudentByZipAndStatus(String zip, int status) { 
    Student student = em.createNativeQuery(sqlMyQuery) 
     .setParameter(1, zip) 
     .setParameter(2, status) 
     .getSingleResult(); 

    return (student); 
} 
Questions connexes