由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - Singleton Session Bean
相关主题
spring解决了什么问题?Re: 4年.NET经验在bay area大概能拿多少? (转载)
guice, spring和ejbConverge of languages and design pattern
question: how to implement thisArraList question
Java EE 习题 1Design question --- hibernate
请问一个问题java的volatile
简单的EJB问题关于 Java bean
Stateful session bean到底有啥好处?basic java question
说说spring和ejb的差别static getInstance()
相关话题的讨论汇总
话题: singleton话题: bean话题: session话题: td话题: counter
进入Java版参与讨论
1 (共1页)







/**
* This singleton stores stores two counters which are only reset when the
application is restarted.
*
* @author Serge Pagop ([email protected]
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
)
*
*/
@Singleton
@Named
public class Counter {
private int a = 1;
private int b = 1;
public void incrementA() {
a++;
}
public void incrementB() {
b++;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
}
t*********e
发帖数: 630
1
一个简单的 demo, 就这一个 class, as a singleton session bean. 然后就是 JSF
中直接对它的引用。 分别点击 Increment, A and B 可分别加 1. 如果去掉
Singleton annotation, 则 click 无效, counter 不增加,A & B 的值一直呆在 1
不变.
这是什么原理? 另外,去掉 @Singleton, Counter 是不是就变成了一个 stateful
session bean.

Counter A#{counter.a}
Counter B#{counter.b}
t*********e
发帖数: 630
2
According to the specification:
A singleton session bean is instantiated once per application and exists for
the lifecycle of the application. Singleton session beans are designed for
circumstances in which a single enterprise bean instance is shared across
and concurrently accessed by clients.
我测试时就一个 session, 一个 browser, single request, single client, 没法解
释上面的行为?
z****e
发帖数: 54598
3
你居然在学ejb,牛逼
singleton就是整个jvm就这一个
然后所有threads对它的访问都是并发并且不加以控制的
你这里i++好像我记得不是原子操作
所以你如果要挨个incre需要控制一下并发
去掉singleton应该是stateless
这样每次访问都是单独隔离的一个ejb来接待
t*********e
发帖数: 630
4
这是 Wildfly 8 里面的例子,还是最新的东西。是,需要并发控制,上面的 code, 等
同于下面的 version. 默认情况下,容器自动加写锁。
session bean 的概念,包括 stateful, stateless, singleton 还是要搞董吧。在同
一个页面,同一个 browser session, 同一个 client, 每单击 “Increment” 一次,
难道这属于多客户的并发访问? JEE 7 Doc:
"A singleton session bean is instantiated once per application and exists
for the lifecycle of the application. Singleton session beans are designed
for circumstances in which a single enterprise bean instance is shared
across and concurrently accessed by clients."
在 JEE 里,如果要实现这种 counter, 不用 singleton bean, 还有什么替代方案?
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
@Named
public class Counter {
private int a = 1;
private int b = 1;
@Lock(LockType.WRITE)
public void incrementA() {
a++;
}
@Lock(LockType.WRITE)
public void incrementB() {
b++;
}
@Lock(LockType.WRITE)
public int getA() {
return a;
}
@Lock(LockType.WRITE)
public int getB() {
return b;
}
}

【在 z****e 的大作中提到】
: 你居然在学ejb,牛逼
: singleton就是整个jvm就这一个
: 然后所有threads对它的访问都是并发并且不加以控制的
: 你这里i++好像我记得不是原子操作
: 所以你如果要挨个incre需要控制一下并发
: 去掉singleton应该是stateless
: 这样每次访问都是单独隔离的一个ejb来接待

t*********e
发帖数: 630
5
另外,stateless bean, 好像必须有 @stateless annotation 才算。

【在 z****e 的大作中提到】
: 你居然在学ejb,牛逼
: singleton就是整个jvm就这一个
: 然后所有threads对它的访问都是并发并且不加以控制的
: 你这里i++好像我记得不是原子操作
: 所以你如果要挨个incre需要控制一下并发
: 去掉singleton应该是stateless
: 这样每次访问都是单独隔离的一个ejb来接待

z****e
发帖数: 54598
6
搞懂不难,但是很多人搞不懂ejb
我也不知道为啥,可能是ejb2的年代有些over kill了
你要写一个计数器,可以押给db去做
找个内存db就好了,或者做成async的thread
不过感觉没有必要,就singleton就是了,然后加上并发控制

,

【在 t*********e 的大作中提到】
: 这是 Wildfly 8 里面的例子,还是最新的东西。是,需要并发控制,上面的 code, 等
: 同于下面的 version. 默认情况下,容器自动加写锁。
: session bean 的概念,包括 stateful, stateless, singleton 还是要搞董吧。在同
: 一个页面,同一个 browser session, 同一个 client, 每单击 “Increment” 一次,
: 难道这属于多客户的并发访问? JEE 7 Doc:
: "A singleton session bean is instantiated once per application and exists
: for the lifecycle of the application. Singleton session beans are designed
: for circumstances in which a single enterprise bean instance is shared
: across and concurrently accessed by clients."
: 在 JEE 里,如果要实现这种 counter, 不用 singleton bean, 还有什么替代方案?

z****e
发帖数: 54598
7
太久没用了,我不太记得了
应该是default就是stateless
不确定,或者如果什么都不加就不是ejb
如果你用了spring那种方式的话
用beans.xml,那default就是singleton

【在 t*********e 的大作中提到】
: 另外,stateless bean, 好像必须有 @stateless annotation 才算。
t*********e
发帖数: 630
8
在同一个页面,就是是同一个用户连续单击一个 button, 如果去掉 @singleton, 每次
就会产生一个不同的 bean instance. 也就是说,即使同一个用户,先后操作同一个事
件,也会被 container 认为是多任务的并发操作,因而产生多个 instance, 对应不同
的客户需求。像 counter 这样的多用户共享的对象,就要用 singleton,以保证在同一
个对象内操作。
问题是,浏览器里面的 session 的概念是不是和服务器里面 (尤其是 EJB) session
概念不一样。由于同一个页面,连续单击一个 button, 浏览器里面肯定是一个
session, 但是在 Web 容器里面就被看成了多用户,多 session 的操作(至少是潜在
的). 可以这样认为不?

【在 z****e 的大作中提到】
: 太久没用了,我不太记得了
: 应该是default就是stateless
: 不确定,或者如果什么都不加就不是ejb
: 如果你用了spring那种方式的话
: 用beans.xml,那default就是singleton

t*********e
发帖数: 630
9
哦,好像是跟 bean 的应用 scope 有关。当去掉 @singleton 后,它变成了 @
Dependent scope, by default. 每次单击,是一个新的请求,产生一个新的 bean
instance, 跟 RequestSope 产生的效果差不多。
ApplicationScoped Specifies that a bean is application scoped.
ConversationScoped Specifies that a bean is conversation scoped.
Dependent Specifies that a bean belongs to the dependent pseudo-scope.
NormalScope Specifies that an annotation type is a normal scope type.
RequestScoped Specifies that a bean is request scoped.
SessionScoped Specifies that a bean is session scoped.
Session Scope: The session scope persists from the time that a session is
established until session termination. A session terminates if the web
application invokes the invalidate method on the HttpSession object, or if
it times out.
RequestScope: The request scope is short-lived. It starts when an HTTP
request is submitted and ends after the response is sent back to the client.
If you place a managed bean into request scope, a new instance is created
with each request. It is worth considering request scope if you are
concerned about the cost of session scope storage.
ApplicationScope: The application scope persists for the entire duration of
the web application. That scope is shared among all requests and all
sessions. You place managed beans into the application scope if a single
bean should be shared among all instances of a web application. The bean is
constructed when it is first requested by any user of the application, and
it stays alive until the web application is removed from the application
server.
g*****g
发帖数: 34805
10
stateful session bean没啥大用,是scale的大忌。单节点的时候看着很方便,等你量
上来了,单节点撑不住,立马面临程序重写。同样的需求,你把它扔进一个关系数据库
,不就简单多了。
t*********e
发帖数: 630
11
像用户注册,用户 shopping, 这类简单,常规的,是不是需要 stateful?
刚开始,还没什么感觉

【在 g*****g 的大作中提到】
: stateful session bean没啥大用,是scale的大忌。单节点的时候看着很方便,等你量
: 上来了,单节点撑不住,立马面临程序重写。同样的需求,你把它扔进一个关系数据库
: ,不就简单多了。

g*****g
发帖数: 34805
12
Session跟stateful是两码事。

【在 t*********e 的大作中提到】
: 像用户注册,用户 shopping, 这类简单,常规的,是不是需要 stateful?
: 刚开始,还没什么感觉

1 (共1页)
进入Java版参与讨论
相关主题
static getInstance()请问一个问题
Singleton vs. static class?简单的EJB问题
Will Singleton Pattern work in Clustered Env?Stateful session bean到底有啥好处?
要准备java面试, 看什么书比较好?说说spring和ejb的差别
spring解决了什么问题?Re: 4年.NET经验在bay area大概能拿多少? (转载)
guice, spring和ejbConverge of languages and design pattern
question: how to implement thisArraList question
Java EE 习题 1Design question --- hibernate
相关话题的讨论汇总
话题: singleton话题: bean话题: session话题: td话题: counter