Weblogic92中使用JDBC store存储session时问题分析 - 编程入门网
情况下,客户端请求进到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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |