|
Session 复制:
由于集群环境中,用户访问的请求在不同的被管理服务器之间不停的切换,而用户访问又需要保持状态(Session),这就要求Session可以穿梭于被管服务器之间,就是各个被管服务器上的Session是一致的,这样用户才感觉不到请求的切换。
集群环境Session的一致性使用了Session复制的技术。
要求一: Servlets must use either setAttribute() or removeAttribute() to change the session object. If you use other set methods to change objects within the session, WebLogic Server does not replicate those changes.
在非集群环境下,我们更改了session中某个对象的属性后是不需要重新将该对象放回session的,但在集群环境下,如果要让其起作用,必须在更改完属性的值后将其放回session 中。
要求二: In order to support in-memory replication for HTTP session states, all servlet and JSP session data must be serializable. If the servlet or JSP uses a combination of serializable and non-serializable objects, WebLogic Server does not replicate the session state of the non-serializable objects.
所有放入session中的数据都必须是经过序列化的,包括类和属性都要是经过序列化的。
要求三:不是硬性要求,而是考虑到性能的因素,最好不要在Session里放置大对象。
实现方法:
在应用webapp的weblogic.xml中添加
<session-descriptor>
<session-param>
<param-name>ersistentStoreType</param-name>
<param-value>replicated</param-value>
</session-param>
</session-descriptor>
注: 将持久性存储方法设置为以下某个选项:
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 中。
replicated是集群中session复制的最常用手段,当然除了这种方式以外,还有其它的一些方式,如使用数据库的方式来保存:
使用数据主加方式复制Session:
1. 首先启动数据库。 通常我们使用的是weblogic能够直接识别的数据库(也是其自带的微型数据库)pointbase。
D:\bea\weblogic92\common\eval\pointbase\tools
在控制台使用命令: startPointBase.cmd 启动数据库
然后在输入: startPointBaseConsole.cmd 启动数据库操作控制台(一个客户端工具)
一般而言,我们都使用默认的配置,用户名通常是PBPUBLIC, 密码也是PBPUBLIC,进入客户端后,接下来我们需要做的是:
2. 创建相关的数据表。
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
);
3. 修改weblogic.xml文件,将其中的persistent-store-type改成jdbc.
<session-descriptor>
<timeout-secs>300</timeout-secs>
<invalidation-interval-secs>60</invalidation-interval-secs>
<persistent-store-type>jdbc</persistent-store-type>
<persistent-store-pool>SessionDS</persistent-store-pool>
<persistent-store-table>WL_SERVLET_SESSIONS</persistentstore-table>
</session-descriptor>
4. 接下来配置一个JDBC的数据源,注意 JNDI的名字要选择我们在上面配置的persistent-store-pool元素的值,此处是SessionDS, 按提示输入相应的数据库类型,数据库名、用户名和密码等。 |
|