Session Bean不能并行访问吗?(200分)

L

leozmy

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个Stateful SessionBean和几个EntityBean,
其中SessionBean使用EntityBean的Local接口存取数据库。
开一个浏览器窗口访问SessionBean时,没有任何问题。
多个浏览器窗口同时访问时,Weblogic提示"Stateful SessionBean
不能并行访问"之类的话,外加一堆乱七八糟的错误。
改成了stateless sb也一样。
我看了一些例子好象可以,书上好象说不行,不太懂。
请有经验的人指教。
 
不知道你说的Session是不是我看到的session,我没用什么SessionBean呀,直接用不就行了??
好奇怪。但愿我能骗到一点分,^_^。
//session对象,记录了用户的相关信息。为用户提供了一个状态的记录。Session对象只能适用于具备cookie功能的浏览器。用来对用户身份进行确认等等,用户退出时,代表这个用户的session对象会被注销。
//Web服务器的系统都会为每一个用户建立一个Session。Session用来保存用户私人信息。Application保存用户公用信息,每个用户的Application对象都是相同的。
//session对象是一个内置对象,它允许用户存储和提取会话状态信息。这个对象在第一个JSP页面被装载时自动创建,并被关联到request对象上。用于多个页面完成一个事务的应用是非常有用的。
//session对象的方法
session.getCreationTime() // 获取这个会话创建时间,精确到毫秒。这个时间是距离1970.1.1以毫秒表示时间的长整数。
session.getId() // 获取这个会话的会话标识符,对每一个用户都是一个唯一的字符串。
session.getLastAccessedTime() // 获取最近一次客户端使用这个会话标识符时创建对话的时间,精确到毫秒。
session.getMaxInactiveInterval() // 获取会话的最长时间
session.getSessionContext() // 获取会话所绑定的上下文
session.getValue(String) // 获取session指定变量中保存的对象,如果找不到,则返回null
session.getValueNames() // 获取session中所有正在使用的变量名称的数组
session.invalidate() // 使session无效
session.isNew() // 返回对话是否为新的布尔值。如果是,返回真。是否为新的标准是:这个会话的上下文已经由服务器创建,但还没有任何用户加入。
session.putValue(String,Object) // 将对象的值赋给指定的session变量,如果指定的变量已经被赋值,则用新的对象值替代原来的变量值。
session.removeValue(String) // 删除指定变量的值
session.MaxInactiveInterval(int) // 设置session不被激活时保存的最长时间。如果session不被用户激活的时间超过这个设置的时间,session将自动失效。
//把信息保存到session对象的变量中
session.putValue("user",username);
session.putValue("id",userid);
//提取保存在session变量中的用户信息
user=(String)session.getValue("user");
userid=(String)session.getValue("id);
 
我在WEBLOGIC上没有作过你那种情况的操作:用 SessionBean 调 EntityBean 。尽管这是J2EE推荐的做法。
我一般只是用 SessionBean ,SessionBean中加Sql语句,没有碰到你所说的问题。
另外:教育版的Weblogic只支持 5 个IP访问。
你还在Weblogic中作了其他特殊的配置吗?譬如线程方面的?
 
兄弟们,weblogic支持中文url吗?????怎么解决?
望赐教!!!!!
 
:papa
没有什么特殊的设置,都是原装的设置,没改动。
我只要有两个ip同时访问就有问题,一个没有任何问题。
假如你可以这么用,那就是我程序上的错误了。
 
首先可以肯定,你所出现的问题是不正常的。
因为我一直使用的架构 就是 Stateless(Stateful) SessionBean + EntityBean(bmp、cmp)
这也是J2EE所支持的基本的体系结构,,,所以不容质疑。
问题出现在什么地方:
一种可能你的ejb 部署描述文件不当
再种可能就是你的WBL系统设置或本身有问题。
当然不排除其他可能。
 
谢谢各位的回答。
这是weblogic的提示:
Stateful Session EJBs cannot be used concurrently. If a stateful session EJB
instance is in the middle of a method call and another call is attempted on
this instance, a java.rmi.RemoteException is thrown. You may also consider
setting the <allow-concurrent-calls> option in your weblogic-ejb-jar.xml.
When this tag is set, the concurrent call waits for the first method call
to complete.: weblogic.ejb20.InternalException: Stateful Session EJBs cannot
be used concurrently. If astateful session EJB instance is in the middle of
a method call and another call is attempted on this instance, a
java.rmi.RemoteException is thrown. You may also consider setting the
<allow-concurrent-calls> option in your weblogic-ejb-jar.xml. When this tag
is set, the concurrent call waits for the first method call
to complete.
at weblogic.ejb20.manager.StatefulSessionManager.acquireLock
(StatefulSessionManager.java:238)
at weblogic.ejb20.manager.StatefulSessionManager.acquireLock
(StatefulSessionManager.java:221)
at weblogic.ejb20.manager.StatefulSessionManager.preInvoke
(StatefulSessionManager.java:318)
at weblogic.ejb20.internal.BaseEJBObject.preInvoke
(BaseEJBObject.java:117)
at weblogic.ejb20.internal.StatefulEJBObject.preInvoke
(StatefulEJBObject.java:169)
改<allow-concurrent-calls>为true好象没什么用。
在SessionBean中调用各种EntityBean有什么要求吗,
我调用了几个EntityBean(cmp)的Local接口,一个EntityBean(bmp)的Remote接口,
这些EntityBean的使用同一个Connection Pool,Bean本身都没有问题,在SB中使用
也没问题,可是并行调用时就有问题。
这样子使用有问题吗?
 
这是我在webapp中的代码:
private NC nc;
public void Init() {
String url = "t3://localhost:7001";
String user = null;
String password = null;
Properties properties = null;
try {
properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);
}
Context ctx = new InitialContext(properties);
Object ref = ctx.lookup("NC");
NCHome newshome = (NCHome) PortableRemoteObject.narrow(ref, NCHome.class);
nc = newshome.create();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
然后用"nc"去调用Remote Interface的方法,我看到一些Sample也是这样子用的啊。
 
你的做法没有什么不当!
感觉还是你的Weblogic的环境或配置上有点问题。
将connection pools 的 Capacity 设置大点试试?
然后再将你的stateful Session 改成 stateless Session试试?
 
没有实践过,下面是我的一些分析,希望对你有帮助:
1。”然后用"nc"去调用Remote Interface的方法“,不知道下一步你是怎么做的?!
2。从出错信息来看:应该是说,你写的Stateful Bean只有一个Instance,即使是从两台不同的机器去浏览,
他们还是共用了同一个Instance,而他们又同时调用了不同的方法(或者说前一个方法调用时间较长没有返回)。
Stateful Session在缺省情况下就会抛出异常,但你把<allow-concurrent-calls>设为true,“没有用”(出错信息还是一样的?),
我觉得不好理解。另外你用Stateless Bean也试过,不知出错信息是什么?肯定应该和这个不同吧。
3。Console上抛出的第一个异常不知道是什么。就是你贴出来的这个信息吗?有时候只有第一个异常信息是有用的。
4。你用的是Weblogic6。0 还是6。1?
我也想知道答案。
 
非常感谢大家的支持。
问题解决,很简单,是我太粗心了。
Maximum Capacity改大就行了,初始是1。
与Stateful无关,不知道为什么会有这个提示,
我也想不通,事实上不可能调用同一个Instance,
也不允许同一个Instance,书上说的。
:papa
第一个异常的确是最有用的,就是我上面说的。
不过后面还有,no resource或could not get connection之类的话,
我没认真理解。
 
多人接受答案了。
 
顶部