论坛首页 Java版

关于EJB3的框架,大家鉴定一下,除了麻烦之外,可实施性如何?有何优点和缺点

浏览 5306 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
最后更新时间:2008-07-27 关键字: ejb3
ORM: JPA
DAO: Stateless SessionBean
Business Logic Facade: Stateless Session Bean
Web Module: HTML/AJAX-->Spring MVC + jndi引用Business Logic Stateless SessionBean

详细sample代码框架如下:
1. 一个Entity:
@Entity
public class Product {
     @ID
     Long id
     .....
}

2. Generic DAO:
  2.1 接口:
public interface GenericDao<T, PK extends Serializable> {
    public T findByPk(PK pk);
    public List<T> findAll();
    public List<T> find(String query);
    public void save(T object);
    public T merge(T object);
    public void remove(T object);
    public void flush();
    public void clear();
    ......
}
  2.2 JPA Generic DAO implementation:
public class GenericDaoJpa<T, PK extends Serializable> implements GenericDao<T, PK>{
    @PersistenceContext
    protected EntityManager entityManager;
    protected Class<T> type;
    // GenericDao接口中各方法的具体实现
    ......
}

3. Product DAO:
// DAO只提供Local接口
@Local
public interface ProductDaoLocal extends persistence.GenericDao<Product, Long>{
}
//
@Stateless
public class ProductDao extends GenericDaoJpa<Product, Long> implements ProductDaoLocal {
}

4. Business Logic Facade:
@Remote
public interface MyModuleFacade {
public void placeOrder(Long productId, Long customerId, int qty);
public List<TheOrder> findAllOrders();
}
@Local
public interface MyModuleFacadeLocal {
}
// 此处涉及多个DAO/Entity,已省略
@Stateless
public class MyModuleFacadeBean implements facade.MyModuleFacade, MyModuleFacadeLocal{
    @javax.ejb.EJB
    ProductDaoLocal productDao;
   
    @javax.ejb.EJB
    CustomerDaoLocal customerDao;
   
    @javax.ejb.EJB
    OrderDaoLocal orderDao;
   
    @javax.ejb.EJB
    CustomerDiscountDaoLocal customerDiscountDao;

    public void placeOrder(Long productId, Long customerId, int qty) {
TheOrder theOrder = new TheOrder();
Customer customer = customerDao.findByPk(customerId);
Product product = productDao.findByPk(productId);
CustomerDiscount discount = customer.getDiscount();
theOrder.setDiscount(discount.getDiscount());
theOrder.setProduct(product);
theOrder.setPrice(product.getPrice() * qty * discount.getDiscount());
theOrder.setCustomer(customer);
theOrder.setQuantity(qty);
orderDao.save(theOrder);
}
}

5. Web Module references Facade:
   5.1 applicationContext.xml中:
    <jee:remote-slsb id="placeOrderFacade" jndi-name="facade.MyModuleFacade"
         business-interface="facade.MyModuleFacade"/>
   5.2 home-servlet.xml中:
    <bean id="placeOrderController" class="action.PlaceOrderController">
    <property name="placeOrderFacade" ref="placeOrderFacade"/>
    </bean>

注:除了麻烦之外
  • 25d9104d-4ccd-3bf3-9eda-c717ea067579-thumb
  • 大小: 26.1 KB
   
最后更新时间:2008-07-27
我也发一个图,楼主说的是第一种架构。我们一开始也用这种方式,可以很方便地针对繁忙的业务增加一台服务器做水平扩展,可后来听说Remote调用很耗时,而且牵涉到分布式事务导致效率地下,领导要求改为第二种方式,将Remote改为Local即可,代价到也不高!
我们没有对两种方式做测试比较,上线后就是第二种方式部署的,暂时还没什么问题。
借楼主的帖子问问,EJB Remote调用和分布式事务真的性能那么低下吗?有多少测试数据来支持?Javaeye批EJB的帖子不少,基本上也就是这两个理由,另外说是开发和测试麻烦,还拿这个理由说事的应该还是停留在EJB2的时代,EJB3开发和测试都很方便了。感觉很多人都是人云亦云! 
很想听听有人实际做过对比的来说说。
  • Cf12bc6a-dee2-3554-aeba-8965870644aa-thumb
  • 大小: 78.7 KB
   
0 请登录后投票
最后更新时间:2008-07-27
光是麻烦这一条加上N多注释这一条,就让我对EJB3敬而远之。
   
0 请登录后投票
最后更新时间:2008-07-27
想问问楼上怎么做EJB的单元测试 如果不依赖AS
   
0 请登录后投票
最后更新时间:2008-08-03
在GLASSFISH水族馆看到这篇博文,里面有4篇文章谈到了EJB 3.1, 有好的建议或疑问可以跟EJB的构架师KEN联系,我也乐意帮忙的。谢谢 !

http://blogs.sun.com/theaquarium/entry/ejb_3_1
   
1 请登录后投票
最后更新时间:2008-08-14
说实话,那些对EJB3说三道四的一般都是没有用过,凭着对EJB2的一些印象,胡乱猜测的。首先说说自己在EJB3开发中的感受:

1. EJB Remote调用确实会降低性能,但在当前的硬件条件下,这点损耗几乎很难体现出来。

2。EJB3 用Annotation完全代替了以前的配置文件,如果你对核心的annotation用熟了后,你会发现开发起来会非常爽,非常方便。

3. 至于EJB 单元测试,如果你是用TestNG的话,你会发觉非常的简单。加上一个dataset就能对数据库进行简单测试。

4. 如果能用maven来配置整个系统的架构的话,将会给你省不少事。并且对比Ant,maven强大,安全,方便N多。在此强烈推荐。

最后,用Spring和用EJB3各有好处,很多哥们对EJB有偏见是因为一来熟悉了Spring后,对完全不同的配置方式不太习惯,二来EJB2残留下来的印象。总之EJB3和Spring各有优劣,不能一概而论。
   
0 请登录后投票
最后更新时间:2008-07-29
EJB2怎么了?我感觉EJB2很不错,就算缺少文档的系统也不是那么难维护。现在反而感觉Spring做出来的项目太容易过时了,重用起来很难受。
   
0 请登录后投票
最后更新时间:2008-07-29
boou 写道
说实话,那些对EJB3说三道四的一般都是没有用过,凭着对EJB2的一些印象,胡乱猜测的。首先说说自己在EJB3开发中的感受:

1. EJB Remote调用确实会降低性能,但在当前的硬件条件下,这点损耗几乎很难体现出来。

2。EJB3 用Annotation完全代替了以前的配置文件,如果你对核心的annotation用熟了后,你会发现开发起来会非常爽,非常方便。

3. 至于EJB 单元测试,如果你是用TestNG的话,你会发觉非常的简单。加上一个dataset就能对数据库进行简单测试。

4. 如果能用maven来配置整个系统的架构的话,将会给你省不少事。并且对比Ant,maven强大,安全,方便N多。在此强烈推荐。

最后,用Spring和用EJB3各有好处,很多哥们对EJB有偏见是因为一来熟悉了Spring后,对完全不同的配置方式不太习惯,二来EJB2残留下来的印象。总之EJB3和Spring各有优劣,不能一概而论。

用了一年的Maven,管了一年的Maven配置,我都烦死这玩意儿了
   
0 请登录后投票
最后更新时间:2008-07-29
EJB2没用过,一用就是用EJB3的,感觉挺好用的,并且remote接口的性能也坏不到哪里去.如果你是本机上同一个JVM使用remote接口的话,有的EJB容器会帮你优化,把它变成通过本地调用的.
感觉挺多人批EJB可能是因为他们没怎么用过,或者说是听人说过而已
其实很多东西要用了才知道好不好
   
0 请登录后投票
最后更新时间:2008-07-29
boou 写道

3. 至于EJB 单元测试,如果你是用TestNG的话,你会发觉非常的简单。加上一个dataset就能对数据库进行简单测试。

4. 如果能用maven来配置整个系统的架构的话,将会给你省不少事。并且对比Ant,maven强大,安全,方便N多。在此强烈推荐。


我是楼主:

请问boou,你用Maven是使用maven-ejb3-plugin吗?我试了一下,发现打包非常的不方便,有什么经验可以share一下吗?


PS:
我自己试验过EJB3之后,也认为从纯粹技术角度EJB3是很不错的技术,而且再加上是Sun出的规范,肯定会得到业界大厂商支持
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐