2011-06-09 30 views
0

我正在爲每個應用程序都有一個WAR文件的項目,它就像一個應用程序商店。
因此,10個應用程序部署了10個不同的WAR文件。通常有一個DAO,BL作爲WAR文件中的獨立JAR,它提供了Web服務。
但很少有情況下,我們通常從另一個WAR文件中引用DAO/BL庫。
我不確定這是否正確。我們似乎在部署時會遇到困難,以找出部署的JAR使用的版本等。另一種方法是不與另一個應用程序的JAR(DAO)進行交談,但在需要時與客戶端部署的Web服務交談。垂直部署優點和缺點在Jboss/MySQL

的DAO的有一個MySQL-ds.xml文件用於在MySQL數據庫中。
我們可以爲所有功能提供單一數據源,但不知道它是否有幫助。

正如你可以從我前一段弄清楚,我有點迷茫,也擔心如果我們有100級不同的應用程序,然後保持與它們的依賴他們的所有100個是真的很難。另外如何從jboss有效地使用連接池?爲所有應用程序或多個數據庫提供單一數據庫會有好處 - 這在維護方面是?我們的堆棧是

Jboss 
Apache CXF 
Dozer 
DAO (Hibernate) 
Entity (POJO) 
Hibernate 
Mysql 

而maven作爲構建工具。我知道我的問題有點普遍,請讓我知道如果你需要一些更多的信息。

回答

1

像這樣的複雜基礎設施總是難以管理。

有你可以採取三種主要方法,各有利弊:

  1. Web服務封裝所有業務層/數據訪問到的API。這最大限度地減少了各種應用程序中JAR版本的激增,但迫使您對API更改進行更嚴格的處理。
  2. 創建可以在多個項目之間共享的庫。我並不清楚你是從另一個WAR文件中引用一個庫的含義,也許這意味着你在新部署的WAR中包含相關的jar。這確實會導致您提到的版本兼容性問題,但可以使修改現有的API更加靈活,因爲您不必立即修改所有現有的應用程序。
  3. 封裝數據庫中的所有數據邏輯。根據我的經驗,這是最有問題的,因爲它將開發與業務邏輯如何工作的知識分開,並且可能是最脆弱的 - 一個存儲過程更改在開始打破其他應用程序時比其他應用程序更難以檢測到方法。

根據我的經驗,這歸結爲在團隊之間建立更多已建立的流程和協議,瞭解如何進行更改。您必須將您的業務層/數據訪問層視爲API,並且非常保守地進行更改。如果您尚未使用連續編譯系統,我會強烈推薦它,因爲它可以幫助您捕獲早期破壞現有應用程序的更改,並允許您保持同步。

+0

感謝您的回覆。我想我真的很困惑,現在當我坐下來思考時,我想我對自己需要發生的事情有了更清晰的認識。我們從設備收集數據並生成不同的報告,其中大多數這些提要非常適合作爲單獨的應用程序。諸如儀表板之類的一些報告需要來自差異Feed的數據。當你創建這樣一個應用程序,以便重用DTO或BL或DAO時,我們會在儀表板應用程序的WAR中將它們用作依賴的jar。因此,如果我寧願在數據庫中創建一個視圖,以執行所有JOIN(如果需要的話),以消除應用程序中的任何依賴性問題。你怎麼看?! – opensourcegeek 2011-06-11 19:38:31

+0

創建視圖是一種選擇。但這聽起來像你也可能正朝着想要一個單獨的數據倉庫的方向發展。 – 2011-06-13 15:45:53

+0

Stevi你讓我好奇,能否請你再解釋一下?我之前沒有使用過任何數據倉庫套件,所以任何方向都非常方便!再次感謝。 – opensourcegeek 2011-06-14 13:16:38

0

這是完全正常的有所有應用程序使用同一個數據庫。

但是,您在運行不同的應用程序以不同的方式使用該數據庫的風險。

爲此,我建議你把儘可能多的邏輯儘可能在MySQL。

我不能告訴你如何做到這一點,因爲我不知道你的應用程序做什麼或需要,但我可以給你一些總體思路和指針。

總體思路和指針

您可以使用存儲過程/函數做的東西

如果您的應用使用存儲過程,以使單個數據庫的東西發生,所有的應用程序將在工作同樣的方式。

使用存儲函數對字段進行計算。 (例如,如使用存儲過程預訂交易)

Price_per_sales_line = price * quantity * 1+tax% * 1-discount% 

如果你把這個邏輯在MySQL的功能,比你不必擔心應用程序A或B調試這一點,因爲所有的應用程序將以相同的方式工作。

而我個人最喜歡的
使用觸發器來確保正常發生。

E.g.如果你有,你需要在一個存儲過程中添加新的項目出售,你的把這個交易,但你也可以這樣做:

僞代碼

CREATE table blackhole_new_sales_item (
    name varchar(45) not null 
    price decimal(10,2) not null 
    category_id integer not null) 
ENGINE = Blackhole; 

DELIMITER $$ 

CREATE TRIGGER ai_bh_new_sales_item_each FOR EACH ROW 
BEGIN 
    /*all stuff inside a trigger happens in a single transaction*/ 
    DECLARE new_item_id INTEGER; 
    INSERT IGNORE INTO items (name) VALUES (NEW.name);   
    SELECT id INTO new_item_id FROM items WHERE name = NEW.name; 

    INSERT IGNORE INTO item_categories (item_id, cat_id) VALUES (new_item_id, NEW.category_id) 

    INSERT INTO price (item_id, price, valid_from, valid_until) VALUES 
    (new_item_id, NEW.price, NOW(), '2038-12-31'); 
END $$ 

DELIMITER ; 

在你的應用程序你可以做一個單一的:

INSERT INTO blackhole_new_sales_item VALUES ('test','0.99',2) 

如果你改變你的數據庫的結構的觸發將採取一切照顧,你只需要改變觸發的內部,所有的應用程序將在不改變工作。
如果向黑洞表中添加額外字段,則只需在每個應用程序中更改單個調用。
您甚至可以創建一個額外的黑洞表併爲此創建一個單獨的觸發器,並使用回退代碼填充舊黑洞表觸發器以支持較舊的應用程序。

因此,這種方法爲您提供了一個指向所有數據庫邏輯的單一點,因此所有應用程序都將以相同的方式運行,同時仍然足夠靈活以支持升級。

希望這會有所幫助。

+0

Johan,我真的不想在數據庫中添加邏輯,但我非常感謝你的觀點,它是從應用程序中刪除依賴項的一種方法。在任何編程語言中處理業務邏輯的原因意味着我們可以寫出乾淨的單元測試,這正好是我們的一種文檔形式(至少這是目標!)),我也不認爲我們會一直堅持使用mysql要麼使用MySQL特定的存儲引擎等不是一種選擇。在重用方面,我需要讓客戶端與不同的API進行對話,而不是在服務器端代碼中存在依賴關係。謝謝! – opensourcegeek 2011-06-11 19:53:21