通常在非集群环境下,可以启动session监听器,每次会话的创建时通过全局变量记录,会话销毁时在全局变量中消除,达到存储会话信息的目的。
在集群环境下采用内存复制方式时,集群环境下服务器间进行Session同步时,监听器不执行创建、销毁方法,直接导致统计session信息不准确(各服务器只能记录本服务器的session,无法进行汇总)。
为了更精确地在集群环境下统计当前会话数及当前在线用户数,暂时看来采用session内存复制的方式无法实现,因此可以考虑变更session管理策略,将会话信息持久化到数据库中。session数据库持久化配置方法来自weblogic9.2官方文档,以oracle数据库为例,具体配置过程如下:
1.首先在数据库中建立存储session的数据表,表命名为wl_servlet_sessions,建表sql语句如下:
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) );
2、在weblogic下建立数据源命名为cognos,并将该数据源指定到wl_servlet_sessions表所在的数据库。(weblogic9.2建立数据源方式参见官方文档)
3、在WEB-INF目录下新建weblogic.xml文件,具体内容如下:
说明:
persistent-store-type设置为jdbc,表示采用数据库存储方式;
persistent-store-pool指定weblogic的数据源名称为cognos(可根据项目实际情况进行更改);
persistent-store-table指定session存储的表名称;其他标签就不做介绍。
context-root设置为cognos,表示当前工程的应用发布名(可根据实际情况进行更改)。
4、编写测试程序如下:
4.1、新建java类SessionDb.java,具体代码如下:
package com.olive;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.StreamCorruptedException;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import weblogic.common.internal.WLObjectInputStream;
import weblogic.j2ee.ApplicationManager;
import weblogic.rmi.utils.io.RemoteObjectReplacer;
import weblogic.servlet.internal.AttributeWrapper;
import weblogic.utils.StackTraceUtils;
import weblogic.utils.io.UnsyncByteArrayInputStream;
public class SessionDb {
static final Hashtable convert(Object obj) {
if (obj == null || (obj instanceof Hashtable))
return (Hashtable) obj;
Dictionary dictionary = (Dictionary) obj;
Hashtable hashtable = new Hashtable(dictionary.size());
Object obj1;
for (Enumeration enumeration = dictionary.keys(); enumeration
.hasMoreElements(); hashtable.put(obj1, dictionary.get(obj1)))
obj1 = enumeration.nextElement();
return hashtable;
}
public static Hashtable deSerializeAttributes(byte abyte0[]) throws IOException,Exception {
Hashtable ht = new Hashtable();
try {
UnsyncByteArrayInputStream unsyncbytearrayinputstream = new UnsyncByteArrayInputStream(abyte0);
if (abyte0[0] == -84 && abyte0[1] == -19) {
SessionMigrationObjectInputStream sessionmigrationobjectinputstream = new SessionMigrationObjectInputStream(
unsyncbytearrayinputstream);
add2table(ht,convert(sessionmigrationobjectinputstream.readObject()));
try {
add2table(ht,convert(sessionmigrationobjectinputstream.readObject()));
} catch (StreamCorruptedException streamcorruptedexception) {
System.out.println("ERROR:deSerializeAttributes is error!");
// internalAttributes = null;
// if(isDebugEnabled())
// DEBUG_SESSIONS.debug("Ignoring the
// StreamCorruptedException " +
// streamcorruptedexception.getMessage());
}
} else {
WLObjectInputStream wlobjectinputstream = new WLObjectInputStream(unsyncbytearrayinputstream);
wlobjectinputstream.setReplacer(RemoteObjectReplacer.getReplacer());
add2table(ht,convert(wlobjectinputstream.readObject()));
try {
add2table(ht,convert(wlobjectinputstream.readObject()));
} catch (StreamCorruptedException streamcorruptedexception1) {
// internalAttributes = null;
// if(isDebugEnabled())
// DEBUG_SESSIONS.debug("Ignoring the
// StreamCorruptedException " +
// streamcorruptedexception1.getMessage());
}
//printTable(ht);
}
} catch (ClassNotFoundException classnotfoundexception) {
throw new IOException("Exception deserializing attributes:"
+ StackTraceUtils
.throwable2StackTrace(classnotfoundexception));
}
return ht;
}
private static class SessionMigrationObjectInputStream extends ObjectInputStream {
public Class resolveClass(ObjectStreamClass objectstreamclass)throws ClassNotFoundException {
return ApplicationManager.loadClass(objectstreamclass.getName(),null);
}
public SessionMigrationObjectInputStream() throws IOException,
SecurityException {
}
public SessionMigrationObjectInputStream(
UnsyncByteArrayInputStream unsyncbytearrayinputstream)
throws IOException, StreamCorruptedException {
super(unsyncbytearrayinputstream);
}
}
public static void printTable(Hashtable p_ht) throws Exception{
Iterator _it= p_ht.entrySet().iterator();
for(;_it.hasNext();){
Map.Entry _entry = (Map.Entry) _it.next();
AttributeWrapper _value =(AttributeWrapper)_entry.getValue();
System.out.println(_entry.getKey() + "=" + _value.getObject().toString() );
}
}
private static Hashtable add2table(Hashtable p_ht,Hashtable p_ht1) throws Exception{
if(null==p_ht1) return p_ht;
Iterator _it= p_ht1.entrySet().iterator();
for(;_it.hasNext();){
Map.Entry _entry = (Map.Entry) _it.next();
AttributeWrapper _value =(AttributeWrapper)_entry.getValue();
p_ht.put(_entry.getKey(), _value.getObject() );
}
return p_ht;
}
}
说明:
deSerializeAttributes方法是该类的核心,该方法负责对wl_servlet_sessions表中存储的session信息进行反序列化,并将反序列化的结果存储到Hashtable数据结构中。
4.2、建立session数据显示jsp页面命名为session_list.jsp,代码如下:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="com.olive.*"%>
<%@ page import="com.olive.security.domain.*"%>
<%@ page import="javax.servlet.http.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>session统计</title>
</head>
<body>
<br>
<%
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/cognos");
Connection conn = ds.getConnection();
Statement sm = conn.createStatement();
ResultSet rs = sm.executeQuery("select * from wl_servlet_sessions");
while (rs.next()) {
System.out.println("userId:"+rs.getString(1));//用户id
byte[] _bytes = rs.getBytes("wl_session_values");
Hashtable _ht = SessionDb.deSerializeAttributes(_bytes);
%>
<hr>
<%
Iterator _it= _ht.entrySet().iterator();
for(;_it.hasNext();){
Map.Entry _entry = (Map.Entry) _it.next();
%>
<%=_entry.getKey()%>=<%= _entry.getValue()%>
<br>
<%
}
}
}
sm.close();
rs.close();
conn.close();
%>
</body>
</html>
5、按照以上步骤操作完成后,将程序打包发布到weblogic9.2上。运行程序中的功能页面,系统会建立session,然后在ie中方问题session_list.jsp页面,该页面会将系统中存在的所有会话信息在页面进行显示。
分享到:
相关推荐
本篇文章将详细阐述如何在Windows环境下部署WebLogic 9.2,包括创建域、启动服务、配置数据源、部署应用以及一些注意事项。 1. **创建WebLogic域** 创建WebLogic域是部署的基础步骤,域包含了WebLogic Server实例...
WebLogic Server 9.2 的集群部署方法是企业级应用在Windows环境中实现高可用性和负载均衡的关键步骤。本文将详细阐述集群配置的整个过程,包括前期准备、管理服务器的安装以及集群成员的设置。 1.1 群集安装前的...
【WebLogic Server 9.2 集群配置详解】 WebLogic Server 9.2 集群配置是一项关键的任务,旨在提高应用程序的可用性和可伸缩性。集群是一种将多个独立服务器组织成一个逻辑单元的技术,它们共享工作负载并提供故障...
本文档详细介绍了在 Linux 操作系统下安装和部署 WebLogic 9.2 集群的步骤和注意事项,涵盖了 JDK 安装、环境变量配置、WebLogic 9.2 集群安装准备、集群概念、集群应用的必要条件、配置前的准备工作等内容。...
WebLogic Server 9.2 集群配置手册是一份详细的指南,用于帮助用户搭建和配置WebLogic集群,以实现高可用性和负载均衡。WebLogic是Oracle公司的一个企业级Java应用服务器,它提供了管理和部署Java应用程序的平台。...
在 Unix 系统下安装 WebLogic 9.2 需要按照特定的步骤进行操作,以确保安装成功。在本文中,我们将详细介绍 WebLogic 9.2 的安装过程,并提供相关的命令和配置信息。 安装 WebLogic 9.2 首先,需要下载 WebLogic ...
本文将详细介绍如何在 WebLogic Server 9.2 上配置集群,以及通过 Proxy Server 访问集群的步骤。 1. 预备知识 - **Domain**:在 WebLogic 中,Domain 是最基本的管理单位,它包含了多个 WebLogic Server 实例、...
WebLogic Server 9.2 集群配置详解 本文对 WebLogic Server 9.2 集群配置进行了详细的讲解,涵盖了 Domain 和 Server 的概念、集群体系结构、配置前的准备工作、使用 Domain Configuration Wizard 进行配置等方面的...
WebLogic 9.2 安装及配置 WebLogic 9.2 是 BEA Systems 公司开发的一款 Java EE 应用服务器,用于部署和管理 Java EE 应用程序。本文档将指导读者安装和配置 WebLogic 9.2 服务器,解决常见的安装和配置问题。 一...
WebLogic Server 在运行时,对并发用户数有特定的限制,这主要是出于版权保护和商业策略的考虑。当你在运营一个大型的、需要处理大量并发用户的业务应用时,这些限制可能会成为阻碍。然而,通过导入特定的许可文件,...
- **环境检查**: 在安装WebLogic 9.2之前,确保计算机满足最低硬件要求,例如足够的内存和磁盘空间。 - **兼容性验证**: 验证所使用的操作系统是否与WebLogic 9.2兼容。 - **软件依赖**: 确保已经安装了必要的软件,...
### WebLogic 9.2 的配置与部署 #### 一、WebLogic 9.2 概述 WebLogic Server 是一款高性能的企业级 Java 应用服务器,由 Oracle 公司开发并维护。WebLogic 9.2 版本是该系列中的一个重要版本,它提供了强大的...
下载链接在附件中,weblogic 9.2 for linux