快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
x.updateLAT()。这个trigger就是LastAccessTimeTrigger,它用于批量更新类似未作修改的session的triggerLAT修改,每10秒被触发一次。我们把这个Session_A交给trigger,这时候triggerLAT被赋一个值(这个值在trigger被触发的时候被写入数据库),假如是2,如下:

Session_A.triggerLAT = 2

1.3: client访问完page2后,继续访问page3, 假如这个时间间隔有点长(但不超过上述trigger的默认间隔10秒),如果系统的访问量很大,或者cache-size设定很小,Session_A在cache中的位置被其他后入的session占据,即session中不再有这个session。请求进入访问page3,由于cache中没有这个对象,我们需要通过getFromDB()从db中load这个对象(注意:load数据后,我们将重建一个session对象,wl_id同于1.1, 1.2的session, 这里用Session_B表示)。如果此刻1.2中的trigger仍没有被触发,即triggerLAT=2没有被写入数据库,那么getFromDB()从db中获取的数据将是1.1的数据,即

Session_B.dbLAT = 1

Session_B.triggerLAT = 0

1.4: 在page3请求处理结束前,即数据被同步到数据库前,1.2的trigger被触发,即它将triggerLAT =2写入数据库。

1.5: page3的请求处理结束,Session_B的dbLAT会变成一个其他值,比如2,如下:

Session_B.dbLAT = 3

Session_B.triggerLAT = 0

此时他同样会通过syncSession()去同步数据,由于page3中涉及session的修改,所以它会通过dbUpdate()去检查数据库中是否存在session_id对应的纪录(数据的确是存在的, wl_access_time=triggerLAT=2),它加查的条件是数据库中的只有wl_access_time等于当前的dbLAT或者triggerLAT,显然数据库中的纪录是不符合条件的,即返回纪录数为0,我们将通过dbCreate()创建一条记录,这样问题就来了,我们尝试创建相同wl_id,相同wl_context_path的纪录,ORA-00001自然就出现了。

这个问题的根源是weblogic没有处理好cache和trigger间对象应用的关系,即trigger拿着对象要求作batch update的时候,如果cache满了,cache中的对象将被删除,新入请求将会于server中创建同一session id对应的不同对象。这个weblogic的一个bug(CR331498),修正bug的方法是通过WeakReference解决trigger和cache间的对象应用关系,即如果某个对象被trigger refer的话,这个对象就不会被从cache中删除。当然,既然是cache的问题,我们其实也可以通过加大cache-size来解决。   

2: 应用场景问题

从1中我们可以看到,引发ORA-00001的根本原因是一个session id的多个sess实例同时存在于一个server上。同样,如果这多个实例分布在不同的server上,这样的问题还是会出现。很简单,加入server_1上有个session,session创建的时候,会往数据库中插入该session对应的记录。如果插入数据后,server_2接收到带着同一session id的request, 那么server_2会从数据库中load数据。如果在server_1、server_2的请求都涉及到session更新,那么后syncSession的那个request必然碰到ORA-00001的错误。比如server_1后结束,因为server_2结束请求时,把db中的数据更新,造成server_1和db中的数据完全不一致,server_1最终会尝试通过dbCreate()创建记录,结果当然是ORA-00001。

现在我们看看什么原因会导致server_1, server_2同时存在同一session id对应的session对象呢? 基本上都是因为前端的代理无法保证session stick,无论是软代理,还是hardware loadbalancer。通常情况下,这些代理都能保证session stick,至于为什么不能保证session stick,我们可以通过相应的日志文件找出原因。比如apache,我们可以打开weblogic的wl proxy debug,log中基本可以帮助我们定位这些问题,可能是某个时刻,server_1无法相应,proxy错误的以为server_1不可用了

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