Weblogic92中使用JDBC store存储session时问题分析 - 编程入门网
Weblogic92中使用JDBC store存储session时问题分析时间:2012-01-14 blogjava 走走停停又三年Weblogic92中,不少系统为了降低系统的内存开销,抑或防止session丢失,管理人员会是用JDBC store来存放session信息。不过在使用这种配置的时候,不少客户反映会碰到约束冲突的异常信息,如下, <Jan 23, 2009 10:07:33 AM CST> <Error> <HTTP Session> <BEA-100087> <The jdbc session data for session id: DcwFJ5mH1HbFrVR2L6z5xpyGXcWLbJFxHrxP2ZF6jQ1hVJ32Gmfl ctx:testWeb dblat:1232676391562 triggerLAT:0 has been modified by another server in the cluster. java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.SYS_C003007) violated at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216) Truncated. see log file for complete stacktrace 本文就对这个问题作一下分析,看看什么样的原因会引起上述问题。 首先,我们想一下,为什么会出现诸如ORA-00001,这样的错误。下面是ORA-00001的问题官方描述, This error means that an attempt has been made to insert a record with a duplicate (unique) key. This error will also be generated if an existing record is updated to generate a duplicate (unique) key. Typically this is a duplicate primary key, but it need not be the primary key. 如上所述,这类问题多是由于我们插入或更新纪录时,出现duplicate (unique) key导致的。Weblogic92中,使用JDBC store来存储session的时候,所有的session会被放入一张叫做wl_servlet_sessions的表中,我们现在看看wl_servlet_sessions,哪些列可能导致duplicate key呢?wl_servlet_sessions的结构如下: create table wl_servlet_sessions ( wl_id VARCHAR2(100) NOT NULL, wl_context_path VARCHAR2(100) NOT NULL, wl_is_new CHAR(1), wl_create_time NUMBER(20), wl_is_valid CHAR(1), wl_session_values LONG RAW, wl_access_time NUMBER(20), wl_max_inactive_interval INTEGER, PRIMARY KEY (wl_id, wl_context_path) ); 对于不同的database,具体表结构请参考 http://e-docs.bea.com/wls/docs92/webapp/sessions.html。从表结构中我们可以看到,weblogic使用wl_id,wl_context_path作为联合主键,由于对于一个session application而言,他的wl_context_path是固定,所以引发ORA-00001的只有wl_id。那么到底是insert,还是update引起这个问题的呢?Weblogic中,更新sessio的时候,只更新session data,不会更新其primary key,也就是说session update不会引起ORA-00001,原因只能是insert,即尝试插入相同wl_id数据的时候,会引发该问题。即使同样是插入操作,其直接原因也可能分为如下几种情况, 1: weblogic的bug 2: 应用场景问题(比如load balancer不能保证session stick) Weblogic92中使用JDBC store存储session时问题分析(2)时间:2012-01-14 blogjava 走走停停又三年下面我会分别介绍一下这两种情况, 1:Weblogic的bug 也许你会问,同一时刻,一个session id不是只能有一个与其对应的session object在内存中吗?而且这应该由weblogic来保证。是的,正常 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |