佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1819|回复: 4

Java 里 Stateless vs Stateful, Remote vs Local, Persistence 的意思

[复制链接]
发表于 15-4-2008 11:32 AM | 显示全部楼层 |阅读模式
根据我读的资料, Stateless Bean 在技术上的解释是不同的JVM 上运行的Java程序是无法access 彼此的。而Stateful Bean 是可以的。

Remote 和 Local 则是会分别 这个bean 可不可以被其他的机器上Java 程序呼叫或access。

我还不是明白得非常透彻, 恳请Java 高手可以能以 Web based database app  为例子, 加少许的coding 比较, 来解释这些term 。

谢谢。
回复

使用道具 举报


ADVERTISEMENT

发表于 15-4-2008 04:12 PM | 显示全部楼层
原帖由 jangancari 于 15-4-2008 11:32 AM 发表
根据我读的资料, Stateless Bean 在技术上的解释是不同的JVM 上运行的Java程序是无法access 彼此的。而Stateful Bean 是可以的。

Remote 和 Local 则是会分别 这个bean 可不可以被其他的机器上Java 程序呼叫或ac ...



Stateless session beans do not maintain the conversational state associated with any client.
意思是说”Stateless session beans“ 做的东西,没有对应任何client.
例:
读取某product的price.
比如有5个client同时create "Stateless session beans", 去读取某product的price.
那return 回来的price直接(胡乱 ps*)丢给任何个client.
因为每个price是同样 value的。

ps*:

--其实不能酱”胡乱“,它是会用最后一个值,看以下例子:
Less s[] = new Less[5];
        for(int i = 0 ; i < 5 ; i ++ ){
            s = home.create();
            s.setCount(i);
        }
        for(int i = 0 ; i < 5 ; i ++){
            System.out.println(s.getCount());
        }
   那打印出来的是:
   5
   6
   7
   8
   9
原因:当他setCount时,最后已经set去“4”了,所以print出来是从“5”开始。

Stateful session beans maintain the state associated with a client.
意思是说”Stateful session beans“ 做的东西,有对应任何client.
例:
购物车
比如有5个client同时create "Stateful session beans", 大家同时有了一辆购物车
那每个client所买的东西是不同的,
所以每辆购物车是有固定的client.


[ 本帖最后由 winmxaa 于 15-4-2008 09:01 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 15-4-2008 06:07 PM | 显示全部楼层

回复 2# winmxaa 的帖子

谢谢你清楚的解释,明白了Stateful 和 Stateless Session Bean 的分别与功能了。

我还有一个疑问, 如果一个Stateful Session Bean declare 了 Stateless Session Bean 的  instance (object) , 那么那个object 是Stateful 还是stateless ? vice-versa 呢?

以下例子里 LibraryCart 是 Stateful , BookDaoImp 是 Stateless 。


例子:
  1. @Stateless
  2. public class BookDaoImp implements BookDao {

  3.         @PersistenceContext
  4.         private EntityManager em;

  5.         private Logger log = Logger.getLogger(this.getClass());

  6.         public void save(Book book) {
  7.                 log.debug("Persist book: " + book);
  8.                 em.persist(book);
  9.         }

  10.         public void merge(Book book) {
  11.                 em.merge(book);
  12.         }

  13.         public List findAll() {
  14.                 log.debug("find All books");
  15.                 return em.createQuery("from Book").getResultList();
  16.         }

  17.         public static final String RemoteJNDIName = BookDaoImp.class
  18.                         .getSimpleName()
  19.                         + "/remote";

  20.         public static final String LocalJNDIName = BookDaoImp.class.getSimpleName()
  21.                         + "/local";

  22.         public Book findById(Integer id) {
  23.                 return em.find(Book.class, id);
  24.         }

  25.         public List findByCustomer(Customer customer) {
  26.                 log.debug("find by customer");
  27.                 return em.createQuery("from Book b where b.customer = :customer")
  28.                                 .setParameter("customer", customer).getResultList();
  29.         }
  30. }





  31. = = = = =



  32. @Stateful
  33. public class LibraryCart implements LibraryCartLocal {
  34.         @PersistenceContext
  35.         private EntityManager em;

  36.         private Logger log = Logger.getLogger(this.getClass());

  37.         private Map<Integer, Book> books = new HashMap<Integer, Book>();

  38.         public static final String RemoteJNDIName = LibraryCart.class
  39.                         .getSimpleName()+ "/remote";
  40.         public static final String LocalJNDIName = LibraryCart.class
  41.                         .getSimpleName()+ "/local";

  42.         public void addBook(Book book) {
  43.                 if (books.get(book.getId()) == null)
  44.                         books.put(book.getId(), book);

  45.         }

  46.         public void addBook(Integer id) {
  47.                 if (books.get(id) == null)
  48.                 {
  49.                         BookDao bookDao;
  50.                         try
  51.                         {
  52.                                 Context context = new InitialContext();
  53.                                 bookDao = (BookDao) context.lookup(BookDaoImp.LocalJNDIName);
  54.                         } catch (NamingException e)
  55.                         {
  56.                                 e.printStackTrace();
  57.                                 throw new RuntimeException(e);
  58.                         }
  59.                         Book book = bookDao.findById(id);
  60.                         if (book != null)
  61.                                 books.put(id, book);
  62.                 }

  63.         }
  64.   略。。

  65. }
复制代码
回复

使用道具 举报

发表于 15-4-2008 11:32 PM | 显示全部楼层
BookDao还是Stateless  Stateless Bean再Context的Stateless Pool里面只有一个Instance
回复

使用道具 举报

 楼主| 发表于 18-4-2008 07:37 PM | 显示全部楼层
谢谢大家的解释,受益良多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 1-1-2026 05:41 PM , Processed in 0.134940 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表