Согласно документации JDO вы создаете один PersistenceManagerFactory
для каждого хранилища данных.Если вы используете JDO для доступа к базам данных через SQL и у вас более одной базы данных, вам понадобится один PersistenceManagerFactory
для каждой базы данных (поскольку при создании PersistenceManagerFactory
необходимо указать URL-адрес JDBC, имя пользователя и пароль)..
Для простых случаев использования вы можете просто создать PersistenceManager
, когда вам это нужно, и закрыть его в предложении finally
(см. документация менеджера постоянства ).
Если вы используете транзакции, и код для обновления сущностей может быть распределен по нескольким методам или объектам, я рекомендую создать PersistenceManager
по требованию и сохранить его в ThreadLocal
(или объекте области запроса, если вы используете Guiceили весна).Это обеспечит участие любого кода, который выполняет обновления, в текущей транзакции.Обязательно закройте 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();
}
}
}