WebObjects/EOF/使用 EOF/批次操作
當處理非常大的資料集時,使用 EOF 的標準技術可能會失效。這裡描述的技術有助於在利用 EOF 的優勢的同時避免記憶體不足的問題。
本主題與記憶體管理部分之間存在相當大的重疊。建議您在閱讀本部分之前回顧一下通用的記憶體管理方法。
對 ec 呼叫 unlock() 然後 dispose(),然後將引用設定為 null,最後使用以下方法強制進行垃圾回收:http://java.sun.com/docs/books/tutorial/essential/system/garbage.html
對於大型資料庫,您需要經常執行此操作,可能每個實體不止一次。我不知道在保持物件圖的同時是否可以這樣做。
以前有一個 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 可在 Sourceforge 獲取。
Wonder 的 ERXJDBCUtilities 中有一些東西應該能夠從一個數據庫複製到另一個數據庫。我從來沒有嘗試過,但也許它能給你一些提示。由於你只是想複製資料,因此實際上沒有必要使用 EO。
哼!“應該能夠從一個數據庫複製到另一個數據庫”。不不,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);
就這樣!
BulkMover 提供了這些功能,雖然它是一個 ProjectBuilder 專案。