weblogic集群下的session复制
在百度搜索 关键字 weblogic session 复制 会出现很多关于此功能的介绍,这里只做些简单的汇总说明:
三种实现方式:
内存复制
JDBC复制
文件系统复制
下边只介绍内存复制方式。
session复制策略:
1.在weblogic中,session是通过配置在weblogic.xml文件中的<session-descriptor>下的<persistent-store-type>属性值来实现的。
<persistent-store-type>包含:
memory– 禁用持久性会话存储。
replicated – 与 memory 相同,但会话数据将在群集服务器之间复制。
replicated_if_clustered – 如果 Web 应用程序部署于群集服务器上,则会复制生效 的 persistent-store-type。否则,memory 为默认值。只只部署到部分集群服务 器上,是不复制的。
sync-replication-across-cluster – 复制将在群集内同步发生。
async-replication-across-cluster – 复制将在群集内异步发生。
file – 使用基于文件的持久性(另请参阅 persistent-store-dir)。
jdbc – 使用数据库存储持久性会话。(另请参阅 persistent-store-pool。)
cookie – 所有会话数据都存储于用户浏览器的 cookie 中。
更多weblogic.xml配置请了解
http://docs.oracle.com/cd/E12840_01/wls/docs103/webapp/weblogic_xml.html#wp1071982
下边只介绍 replicated_if_clustered情况。
2. 一定要在负载均衡的基础上。
3. session 只存在于两个服务实例中(每个实例都有两份Session数据,主数据和备份数据),一个是主对象服务,一个是备份服务。当一个session创建后,同时生成一个备份session放到备份服务实例中去。
当主服务实例异常宕掉后,用户访问会被分配到另一个服务实例中去(这是实例可能是该服务设置的session备份服务,也可能是另一个没有存储该服务session的服务实例)。
这时,处理请求的新服务实例,会去获取之前备份的session到本服务中,此服务实例为主对象服务,然后再备份一个新session,放到它所对应的备份服务中去。
如何设置备份服务对象?
这里引入了复制组的概念,复制组是把所有集群服务(包括同一台机器上的和不在同一台机器上的)按逻辑分组。WLS允许你使用复制组,决定在哪里放置备份对象。
每个服务都有两个属性,复制组和手选次级组
复制组即为本服务对应的逻辑分组,手选次级组即为该服务对应的备份组。
设置分组后,每个服务自己就是主服务对象,他们都对应一个备份服务。
WLS尝试以下方式进行session复制:
如果配置过,发送备份对象给预定义次要复制组
发送备份对象给不同机器
避免发送备份对象给同一个复制组中的服务器
session备份及找备份服务的方式,是分优先级的:
优先级1——同一复制组,不在同一台机器上
优先级2——非同一复制组,不在同一台机器上
优先级3——同一复制组,在同一台机器上
优先级4——非同一复制组,在同一台机器上
实现步骤:
第一步:在我们的代码里增加weblogic.xml设置。
下边是测试代码里weblogic.xml的配置
<!--[endif]-->
第二步:写测试代码。
这里要注意 session复制是有要求的。
1.session 必须序列化,session 中的对象要实现java.io.Serializable接口
2.设置和获取session中的属性需要使用setAttribute() 和getAttribute()
3.避免大的session对象,因为往session中存放的数据比较大时,系统的响应速 度明显变慢,有时会出现内存溢出的情况。
第三步:打包部署 TestApp.war
第四步:设置复制组。
复制组设置时,最优的方案是一个闭环链路 例如 grouyA->groupB->groupC->groupA
经38和217设置,不设置复制组或设置非链路的也可以实现session复制
第五步:运行测试
访问:http://192.168.100.38:8059/TEST/test.jsp
点击test按钮,查看是38还是217处理了请求,把处理请求的服务关掉,继续操作test页面,关掉服务前,设置session的数据还能读取出来,即为成功。