快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
情况下,客户端请求进到Weblogic的时候,weblogic会检查cache中是否存在与其session id对应的session object,有的话,从cache中取出,没有的话,它会通过getFromDB()从database中load,如果还是没有,这时候才会通过dbCreate去插入一条记录。 如果中间某一处weblogic没有控制好的话,问题就来了。我将以如下的一个test作为案例,分析一下具体过程,

这里将不考虑应用场景问题,即session stick可以被保证。假如一个客户在访问应用系统时,顺序访问了三个应用页面(page 1/2/3),而这三个页面中, page 1/3会涉及session更新(set attribute),而page 2只读取session(get attribute). 由于这个问题和session的dbLAT、triggerLAT相关,所以我们主要这里主要关注 dbLAT、triggerLAT的变化及问题点。

1.1: client访问page1, 假如page1中第一次访问session对象,由于cache和db中均没有该对象,那么我们会创建一个session, 并以wl_id和wl_context_path作为主键,插入纪录。page1中作写setAttribute的动作,请求结束后,这个对象会被同步到数据库,同时session数据被放入内存的cache中,如下:

1   public void sync(HttpSession data) {
2     // This should be invoked only at the end of the request
3       
4       session.syncSession();
5       cache.put(session.id, data);
6       
7 
8   }

注意:cache用于限制内存中当前active的session数,当cache满了的时候,最早进入cache的session将被从cache中挪走。默认的cache size为1024,这个至可以通过session-descriptor的cache-size配置。

在来看看session.syncSession()逻辑, 它通过dbUpdate()实现,dbUpdate()如下:

 1 private void dbUpdate() throws SQLException {
 2         
 3     if (isModified()) {
 4     conn = getConnection(jdbcProps);
 5     stmt = conn.prepareStatement(jdbcCtx.getUpdateQuery());
 6     int i = 0;
 7     
 8     // the sql update is performed only if the lat in the DB matches the value of dbLAT or triggerLAT.
 9     i = stmt.executeUpdate();
10     if (i > 0) {
11           dbLAT = accessTime;
12           triggerLAT = 0;
13         }
14     if (i == 0) {
15           dbCreate();
16     }
17       } else {
18         // Session Data has not changed so just update last access time
19         jdbcCtx.updateLAT(this, contextName);
20       }
21   }

Weblogic92中使用JDBC store存储session时问题分析(3)

时间:2012-01-14 blogjava 走走停停又三年

这里可以看到,syncSession的时候,首先检查对象是否作过修改,如果没有,通过jdbcCtx.updateLAT()去更新triggerLAT,如果做过修改,我们到数据库中检查对象是否存在,存在的话,更新dbLAT,如果不存在,通过dbCreate()插入纪录。我们这一步中,因为是第一个请求,所以db中没有记录,要通过dbCreate()插入纪录,假如同步进数据库的dbLAT为1,由于这是没有timerTrigger被触发,它的triggerLAT为0。

1.2: client访问完page1后,继续访问page2,由于cache中能够找到session-id对应的对象,我们直接利用cache中的对象,该对象属性如下:

Session_A.dbLAT = 1(这里1标示某个时间点)

Session_A.triggerLAT = 0

请求结束时,由于我们没有修改这个session对象(只做了read attribute), 在syncSession的时候,我们会把这个update操作交给trigger去做,即jdbcCt

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号