javax.persistence.Query对象是否可以缓存?

时间:2009-11-13 15:51:51

标签: java multithreading persistence

我正在编写一个无状态EJB。 我有类似的方法:

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

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

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

感谢。

3 个答案:

答案 0 :(得分:1)

不,你不能。 Query由(和引用)特定EntityManager实例创建,该实例为:

  1. 不是线程安全的。
  2. 不应长时间保持。

答案 1 :(得分:1)

我认为ChssPly76是对的。但你应该看看NamedQueries。也许这是你想要的方向。

答案 2 :(得分:0)

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

这是一个非常简化的示例(我为任何语法或其他错误道歉):

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