快速业务通道

Weblogic92中使用JDBC store存储session时问题分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号