如何使用JDO持久性管理器?

时间:2010-11-15 14:40:29

标签: java persistence jdo persistence-manager

关于如何创建/使用JDO持久性管理器(PM,以下简称),我有两个问题。

在Java Web应用程序中说,如果我有10个实体,可以在逻辑上分为2组(例如,5个用户相关实体和5个业务相关实体)

  1. 我是否需要两个不同的PM来管理这两个组,或者只有一个PM是否足够?
  2. 关于初始化,我应该使用PM的单例实例(所有用户在给定的时间点使用该应用程序共享)还是应该为每个会话创建一个PM?

1 个答案:

答案 0 :(得分:14)

根据JDO Documentation,您为每个数据存储区创建一个PersistenceManagerFactory。如果您使用JDO通过SQL访问数据库并且您有多个数据库,那么每个数据库需要一个PersistenceManagerFactory(因为您需要在创建{{{}时指定JDBC URL,用户名和密码1}})。

对于简单的用例,您可以在需要时创建PersistenceManagerFactory并在PersistenceManager子句中关闭它(请参阅the persistence manager documentation)。

如果您使用事务,并且更新实体的代码可以分布在多个方法或对象上,我建议您按需创建finally并将其存储在PersistenceManager(或请求范围的对象)中如果你使用Guice或Spring)。这将确保执行更新的任何代码都参与当前事务。请务必在请求结束时关闭ThreadLocal

如果您只需要一个持久性管理器工厂,则可以执行以下操作:

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

注意:为了回答您的问题,我使用了所有静态方法使其变得简单。如果我使用像Guice这样的依赖注入框架,我会使这些方法非静态并将Datastore.getPersistenceManager()绑定为Singleton。

您可以在Servlet过滤器中调用Datastore

finishRequest