Jboss / MySQL中的垂直部署优缺点

时间:2011-06-09 14:20:32

标签: mysql hibernate deployment jboss

我正在开发一个项目,每个应用程序都有一个WAR文件,它就像一个应用程序商店 所以10个应用程序部署了10个不同的WAR文件。通常在WAR文件中有一个DAO,BL作为单独的jar,它暴露了Web服务 但是,很少有情况我们通常从另一个WAR文件中引用DAO / BL库 我不确定这是不是正确的做法。在部署以确定使用了哪些版本的已部署JAR时,我们似乎遇到了困难。另一种方法是不与另一个应用程序的JAR(DAO)交谈,但如果需要,请与客户端部署的Web服务进行通信。

DAO的MySQL中有一个数据库的mysql-ds.xml 我们可以为所有功能提供一个数据源,但不确定它是否有帮助。

正如你可以从我上一段中弄清楚的那样,我有点困惑,也担心如果我们有100个不同的应用程序,那么用它们的依赖关系维护所有100个应用程序真的很难。如何从jboss有效地使用连接池?为所有应用程序或多个数据库建立单个数据库是否合适 - 这是在维护方面?我们的筹码是

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

并且maven作为构建工具。我知道我的问题有点笼统,如果您需要更多信息请告诉我。

2 个答案:

答案 0 :(得分:1)

像这样的复杂基础设施总是很难管理。

您可以采取三种主要方法,每种方法都有利有弊:

  1. 将所有业务层/数据访问封装到API中的Web服务。这可以最大限度地减少各种应用程序中jar版本的扩散,但会迫使您对API更改更加严格。
  2. 创建可在多个项目之间共享的库。通过引用另一个WAR文件中的库,我不清楚你的意思,也许这就是你在新部署的WAR中包含相关jar的意思。这确实会导致您提到的版本兼容性问题,但可以使修改现有API更加灵活,因为您不必立即修改所有现有应用程序。
  3. 封装数据库中的所有数据逻辑。根据我的经验,这是最成问题的,因为它将开发人员与业务逻辑如何工作的知识区分开来,并且可能是最脆弱的 - 当一个存储过程变更开始破坏其他应用程序而不是其他应用程序时,可能更难以检测到方法
  4. 根据我的经验,它归结为团队之间建立了更多已建立的流程和协议,以了解如何进行变更。您必须将业务层/数据访问层视为API,并对进行更改非常保守。如果你还没有使用连续构建系统,我强烈推荐它,因为它可以帮助你捕捉早期破坏现有应用程序的更改并允许你保持同步。

答案 1 :(得分: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)

触发器将处理所有内容,如果您更改数据库的结构,则只需更改触发器内部,所有应用程序都可以正常工作。
如果您在黑洞表中添加额外的字段,则只需更改每个应用中的单个呼叫 您甚至可以创建一个额外的黑洞表并为其创建单独的触发器,并使用后备代码填充旧黑洞表触发器以支持旧版应用程序。

因此,这种方法可以让您将所有数据库逻辑放入其中,以便所有应用程序都以相同的方式运行,同时仍然足够灵活以支持升级。

希望这有帮助。