2009-11-13 120 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); 
} 
相關問題