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

Vee*_*era 5 java persistence jdo persistence-manager

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

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

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

Nam*_*ter 14

根据JDO文档,您可以PersistenceManagerFactory为每个数据存储创建一个.如果您使用JDO通过SQL访问数据库并且您有多个数据库,则PersistenceManagerFactory每个数据库需要一个(因为您需要在创建时指定JDBC URL,用户名和密码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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

任何需要持久性管理器的代码都可以调用 Datastore.getPersistenceManager()

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

你可以调用finishRequestServlet过滤器:

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();
    }    
  }
}
Run Code Online (Sandbox Code Playgroud)