JDO:PersistenceManager是单例吗?

时间:2010-10-28 06:48:31

标签: java jdo db4o datanucleus

基本知识:我正在使用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,我会得到线程安全的东西。

  • 我是否需要制作PersistenceManager 整个单身人士 应用?
  • 怎么做多个 线程,执行查询和 更新在JDO / DataNucleus中工作?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我是否需要在整个应用程序中使PersistenceManager成为单身?

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

所以PersistenceManager-instance代表一个单元工作/事务。

答案 2 :(得分:2)

顺便说一句,我撕掉了DB4O并且在NeoDatis中出现了(感谢DN让它完成了5分钟的任务)以及六个测试用例中的每一个让我感到困惑并且双手神奇地工作。并发事务的表现就像我认为的那样,我可以突然持续存在可序列化对象的集合(一个单独但同样令人沮丧的问题),并且至少还有4个是这些对象的衍生物。

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

我无法想象在用了5分钟的NeoDatis幸福消除了3天的地狱之后切换回DB4O。 :)

答案 3 :(得分:1)

当您在“文件”模式下操作时,您期望db4o如何支持并发请求?本来以为服务器模式是先决条件