Как использовать диспетчер персистентности JDO?
У меня есть два вопроса о том, как создать / использовать диспетчер персистентности JDO (далее в тексте "PM").
Скажем, в веб-приложении Java, если у меня есть 10 сущностей, которые могут быть логически сгруппированы в 2 группы (например, 5 сущностей, связанных с пользователем, и 5 сущностей, связанных с бизнесом)
- Нужно ли мне два разных руководителя для управления этими двумя группами, или достаточно одного?
- Что касается инициализации, должен ли я использовать одноэлементный экземпляр PM (который будет совместно использоваться всеми пользователями, использующими приложение в данный момент времени) или я должен создать PM для каждого сеанса?
1 ответ
Согласно Документации JDO вы создаете PersistenceManagerFactory
в хранилище данных. Если вы используете JDO для доступа к базам данных через SQL и у вас есть более одной базы данных, то вам понадобится одна PersistenceManagerFactory
для каждой базы данных (так как вам нужно указать URL JDBC, имя пользователя и пароль при создании PersistenceManagerFactory
).
Для простых случаев использования вы можете просто создать PersistenceManager
когда вам это нужно и закройте его в finally
пункт (см. документацию менеджера постоянства).
Если вы используете транзакции, и код для обновления сущностей может быть распределен по нескольким методам или объектам, я рекомендую создать PersistenceManager
по требованию и хранить его в ThreadLocal
(или объект в области запроса, если вы используете Guice или Spring). Это обеспечит участие любого кода, который выполняет обновления, в текущей транзакции. Обязательно закройте PersistenceManager
в конце запроса.
Если вам нужна только одна фабрика диспетчера персистентности, вы можете сделать:
public class Datastore {
private static PersistenceManagerFactory PMF;
private static final ThreadLocal<PersistenceManager> PER_THREAD_PM
= new ThreadLocal<PersistenceManager>();
public static void initialize() {
if (PMF != null) {
throw new IllegalStateException("initialize() already called");
}
PMF = JDOHelper.getPersistenceManagerFactory("jdo.properties");
}
public static PersistenceManager getPersistenceManager() {
PersistenceManager pm = PER_THREAD_PM.get();
if (pm == null) {
pm = PMF.getPersistenceManager();
PER_THREAD_PM.set(pm);
}
return pm;
}
public static void finishRequest() {
PersistenceManager pm = PER_THREAD_PM.get();
if (pm != null) {
PER_THREAD_PM.remove();
Transaction tx = pm.currentTransaction();
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
}
}
Любой код, которому нужен менеджер постоянства, может вызвать Datastore.getPersistenceManager()
Примечание. Я использовал все статические методы, чтобы упростить ответ на ваш вопрос. Если бы я использовал фреймворк для внедрения зависимостей, такой как Guice, я бы сделал методы нестатичными и связанными Datastore
как синглтон.
Вы могли бы позвонить finishRequest
в фильтре сервлетов:
public class PersistenceManagerFilter implements javax.servlet.Filter {
public init(FilterConfig filterConfig) {
Datastore.initialize();
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(request, response);
} finally {
Datastore.finishRequest();
}
}
}