关于如何创建/使用JDO持久性管理器(PM,以下简称),我有两个问题。
在Java Web应用程序中说,如果我有10个实体,可以在逻辑上分为2组(例如,5个用户相关实体和5个业务相关实体)
答案 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