代码之家  ›  专栏  ›  技术社区  ›  David Parks

JDO:PersistenceManager是单例的吗?

  •  3
  • David Parks  · 技术社区  · 14 年前

    基础知识:我使用的是DataNucleus,它有一个嵌入的DB4O数据库。

    如果我做这个简单的测试:

        PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
        PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManager();
    
        pm1.makePersistent(t1);
        pm2.makePersistent(t2);
    

    我收到一个文件锁定异常:

    com.db4o.ext.DatabaseFileLockedException: C:\<path>\primary_datastore.data
    

    PersistenceManager 应该有用的。我以为我刚打过电话 PersistenceManagerFactory 每当我需要一个 存储管理器

    • 我需要让PersistenceManager 在我的整个 申请?
    • 如何多重 线程,执行查询和 更新JDO/DataNucleus中的工作?
    4 回复  |  直到 14 年前
        1
  •  2
  •   Gamlor Gabriele Ran    14 年前

    我需要让PersistenceManager成为整个应用程序中的一个单例吗?

    这取决于你的申请。如果开发桌面应用程序,可能只需要一个持久性管理器。此持久性管理器表示桌面应用程序的数据库状态。 但对于其他场景,情况并非如此。例如,在web应用程序中,您希望将请求或会话彼此隔离。因此您使用多个PersistenceManager。例如,每个请求一个PersistenceManager。每个PersistenceManager保存当前请求的状态和事务。

        2
  •  2
  •   Tomas Narros    14 年前

    因此,按照指南,您的代码应该可以处理此更改:

    PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
    PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManagerProxy();
    
    pm1.makePersistent(t1);
    pm2.makePersistent(t2);
    

    第二个实例是引用实例化的第一个PersistenceManager的代理。

    例如,按程序设置:

    Properties properties = new Properties();
    properties.setProperty("javax.jdo.PersistenceManagerFactoryClass",
                    "org.datanucleus.jdo.JDOPersistenceManagerFactory");
    //configure connection, etc...
    properties.setProperty("javax.jdo.option.Multithreaded", "true");
    PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);
    
        3
  •  2
  •   David Parks    14 年前

    也许是我错误地配置了DB4O(尽管我有一个我可能想到的普通安装),但是NeoDatis在“It just works”类别中获得了主要的加分。两个vanilla嵌入式安装都创建一个文件,都通过DataNucleus响应JDO。

    我无法想象在用5分钟的NeoDatis bliss抹去了3天的地狱之后切换回DB4O。:)

        4
  •  1
  •   DataNucleus    14 年前