2011-06-09 112 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