2009-08-19 68 views
0

我正在尋找用於管理靜態數據的Java(或Groovy)解決方案,即不經常更改表格(如國家/地區列表)中的數據。管理靜態數據

我想將國家列表保存在文本文件中,並在服務器啓動時自動更新表格。我不能簡單地刪除所有表格,然後重新插入文本文件中的數據,因爲這會違反關鍵限制。

DbUnit是一個支持從XML文件將數據加載到數據庫中的庫。它有一個refresh operation其中幾乎做我所需要的。這將插入文件中但不包含在數據庫中的所有行,更新數據庫中也包含在文件中的所有行,但不會刪除數據塊中但不包含在文件中的任何行。

有沒有人找到這個問題的一個很好的解決方案?

謝謝, 唐

+1

如果數據不經常變化,那麼爲什麼每次服務器啓動時都需要填寫整個表?將一些數據庫腳本填充到這些表中,將它們放到源代碼管理中,讓開發人員能夠訪問這些腳本並將腳本應用到數據庫以更改控制,是否更有意義? – APC 2009-08-20 14:09:55

回答

0

有幾個開源DBMS系統,以及DbUnit的看起來是合理的。

我很疑惑你爲什麼要保留你的主副本作爲文本文件 - 爲什麼不使用數據庫作爲主?

+0

我不想使用數據庫作爲主數據庫,因爲它的內容不受源代碼管理,開發人員也無法訪問數據庫 – 2009-08-19 19:08:17

0

如果您使用Hibernate,可以使用Castor將國家(例如)的XML文件加載到Hibernate模型對象中,然後保存這些對象。

您可能需要管理插入/更新/刪除邏輯上自己的...它可以用這個僞代碼來概括:

  • 加載XML進入休眠對象通過蓖麻
  • 對於每一個對象:
    • 如果對象是數據庫,調用更新
    • 如果對象是不是在數據庫,調用保存
  • 然後在DB
    • 每個記錄每條記錄進行比較,以你的對象的列表,並刪除如果不是在你的列表中找到

我希望這是明確的......我們有一個類似的過程中用戶將上傳XML文件以刷新數據庫。

1

我之前通過推遲約束解決了這個問題。

通常,在行中插入或更新數據時檢查約束。插入行時,將檢查所有約束,並接受或拒絕該行。但是,您可以延遲約束檢查,直到事務提交。見:

http://www.remote-dba.cc/t_garmany_easysql_deferred_constraints.htm

這是供應商特定的行爲。它在oracle中工作,但據我所知,在mysql中不支持。

+0

問題不在於主表中的行將被臨時刪除,但是,一旦它們再次被插入,主鍵的值將會不同。如果一個數據庫允許PK被重用,它們的行可以像以前一樣插入相同的PK值,但在我的情況下,我使用MySQL自動生成的PK – 2009-08-19 21:39:53