3

Just the basics: I'm using DataNucleus backed with an embedded DB4O database.

If I do this simple test:

    PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
    PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManager();

    pm1.makePersistent(t1);
    pm2.makePersistent(t2);

I get a file locked exception:

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

Which tells me I don't know how the PersistenceManager is supposed to work. I thought I just called PersistenceManagerFactory whenever I needed a PersistenceManager to query or persist data and I would get something thread safe.

  • Do I need to make PersistenceManager a singleton across my entire application?
  • How do multiple threads, performing queries and updates work in JDO/DataNucleus?
4

4 回答 4

2

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

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

所以 PersistenceManager 实例代表一个单元工作/事务。

于 2010-10-28T09:16:06.510 回答
2

顺便说一句,我撕掉了 DB4O 并弹出了 NeoDatis(感谢 DN 让这成为了一个 5 分钟的任务),并且让我感到困惑和举手的六个测试用例中的每一个都神奇地起作用了。并发事务的行为正如我所认为的那样,我可以突然持久化可序列化对象的集合(一个单独但同样令人沮丧的问题),以及至少 4 个其他这些对象的派生。

也许是我错误配置 DB4O 的错(尽管我尽可能地安装了香草),但 NeoDatis 在“它只是工作”类别中获得了主要奖励积分。两个 vanilla 嵌入式安装,都创建一个文件,都通过 DataNucleus 响应 JDO。

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

于 2010-10-29T04:44:09.480 回答
2

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

PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManagerProxy();

pm1.makePersistent(t1);
pm2.makePersistent(t2);

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

  • 为了使您的 PersistenceManager 线程安全,您必须在 PersistenceManagerFactory 设置datanucleus.ConnectionFactory或其别名javax.jdo.option.Multithreaded)属性。

例如,以编程方式设置它:

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);
于 2010-10-28T07:20:40.767 回答
1

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

于 2010-10-28T11:10:15.877 回答