2009-11-13 90 views
2

我在写无状态的EJB。 我的方法,如:javax.persistence.Query对象是否可以被缓存?

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

我可以缓存查询对象在加载时实例化,并在多线程环境中使用它?

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

谢谢。

回答

1

不,你不能。

  1. 不是线程安全的:Query是(和引用)特定EntityManager实例被创建。
  2. 不应长时间保持。
1

我认为ChssPly76是正确的。但你也许应该看看NamedQueries。也许这是你寻找的方向。

0

但是,您可以使查询字符串本身类实例化。这将在这里和那里为你节省一个纳秒。

这里的一个大大简化例子(I为任何语法或其他错误道歉):

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); 
} 
相关问题