基本知识:我正在使用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
,我会得到线程安全的东西。
答案 0 :(得分:2)
因此,按照指南,您的代码应该可以使用此更改:
PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManagerProxy();
pm1.makePersistent(t1);
pm2.makePersistent(t2);
第二个实例是引用第一个PersistenceManager实例化的代理。
datanucleus.ConnectionFactory
设置PersistenceManagerFactory(或其别名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);
答案 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如何支持并发请求?本来以为服务器模式是先决条件