跳转到内容

WebObjects/EOF/使用 EOF/批量操作

来自维基教科书,开放的书籍,开放的世界

当处理非常大的数据集时,使用 EOF 的标准技术可能会失效。这里描述的技术有助于在利用 EOF 的优势的同时避免内存不足的问题。

本主题与内存管理部分之间存在相当大的重叠。建议您在阅读本部分之前回顾一下通用的内存管理方法。

在数据库之间移动大量数据

[编辑 | 编辑源代码]

Chuck Hill

[编辑 | 编辑源代码]

对 ec 调用 unlock() 然后 dispose(),然后将引用设置为 null,最后使用以下方法强制进行垃圾回收:http://java.sun.com/docs/books/tutorial/essential/system/garbage.html

对于大型数据库,您需要经常执行此操作,可能每个实体不止一次。我不知道在保持对象图的同时是否可以这样做。

Pierce T Wetter III

[编辑 | 编辑源代码]

以前有一个 EOUtil 可以做类似的事情。它还存在吗?

否则,这取决于 ER 关系图的工作方式。在我们的案例中,我们有一组对象,它们或多或少地“拥有” ER 树中的所有其他对象。因此,代码将类似于以下示例

 get master editing context
 fetch copies of all the master objects into the master ec (not that many, so ok)
 for each master object:
    make a local ec
    copy the master object into the local ec (localInstanceOfObject())
     do stuff with master object (i.e. copy them into the sink model)
    toss local ec

使用本地 EC 是关键。

如果您有大量的主对象,以至于无法一次将它们全部加载到内存中,那么就会变得更棘手。一种方法是只使用原始行获取主键列表,然后使用 objectWithPrimaryKeyValue() 在本地编辑上下文中构建对象。

如果您的 ER 树更复杂(没有“所有者”对象,那么 YMMV)。

来自 Cassini 的 EOImportExportApplication

[编辑 | 编辑源代码]

Cassini 可在 Sourceforge 获取。

Anjo Krank

[编辑 | 编辑源代码]

Wonder 的 ERXJDBCUtilities 中有一些东西应该能够从一个数据库复制到另一个数据库。我从来没有尝试过,但也许它能给你一些提示。由于你只是想复制数据,因此实际上没有必要使用 EO。

David Teran

[编辑 | 编辑源代码]

哼!“应该能够从一个数据库复制到另一个数据库”。不不,Anjo,这很不公平;-)

事实上,它完美地工作 - 如果 - JDBC 驱动程序没有错误。以下是一份简要的文档

好的,您需要使用 ERExtensions 和 ERJars。没什么大不了的,给我发个邮件,我会把一个演示应用程序发给你。

然后,您需要以下代码,该示例从 frontbase 中获取数据并将其保存到 postgres 数据库

 NSMutableDictionary sourceDict = new NSMutableDictionary();
 sourceDict.setObjectForKey("", "password");
 sourceDict.setObjectForKey("_SYSTEM", "username");
 sourceDict.setObjectForKey("jdbc:FrontBase://195.135.143.205/merces/user=_system", "url");
 sourceDict.setObjectForKey("com.frontbase.jdbc.FBJDriver", "driver");
 sourceDict.setObjectForKey(Boolean.FALSE, "autoCommit");
 sourceDict.setObjectForKey(Boolean.TRUE, "readOnly");
 
 NSMutableDictionary destDict = sourceDict.mutableClone();
 destDict.setObjectForKey("jdbc:postgresql://195.135.143.205/merces", "url");
 destDict.setObjectForKey("dev", "password");
 destDict.setObjectForKey("dev", "username");
 destDict.setObjectForKey("org.postgresql.Driver", "driver");
 destDict.setObjectForKey(Boolean.FALSE, "autoCommit");
 destDict.setObjectForKey(Boolean.FALSE, "readOnly");
 
 EOModel yourModel  = EOModelGroup.defaultGroup().modelNamed("YourEOModelName");
 ERXJDBCUtilities.copyDatabaseDefinedByEOModelAndConnectionDictionaryToDatabaseWithConnectionDictionary(yourModel,
     sourceDict, destDict);

就这样!

来自 360works 的 BulkMover

[编辑 | 编辑源代码]

BulkMover 提供了这些功能,虽然它是一个 ProjectBuilder 项目。

华夏公益教科书