Являются ли объекты javax.persistence.Query кэшируемыми? - PullRequest
2 голосов
/ 13 ноября 2009

Я пишу 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 ]

1 голос
/ 13 ноября 2009

Я думаю, что ChssPly76 прав. Но вам стоит взглянуть на NamedQueries . Может быть, это что-то в твоем направлении.

1 голос
/ 13 ноября 2009

Нет, вы не можете. Query создается (и ссылается) конкретным экземпляром EntityManager, который:

  1. Не потокобезопасен.
  2. Не следует удерживать в течение длительных периодов времени.
0 голосов
/ 18 сентября 2013

Тем не менее, вы можете сделать запрос 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...