`
liuhaoyi490
  • 浏览: 23085 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

在weblogic9.2集群环境下准确统计当前会话数及在线用户数

阅读更多

      通常在非集群环境下,可以启动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文件,具体内容如下:
  
 <?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://www.bea.com/ns/weblogic/90" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
  <wls:session-descriptor>
    <wls:timeout-secs>300</wls:timeout-secs>
    <wls:invalidation-interval-secs>60</wls:invalidation-interval-secs>
    <wls:persistent-store-type>jdbc</wls:persistent-store-type>
 <wls:persistent-store-pool>cognos</wls:persistent-store-pool>
 <wls:persistent-store-table>wl_servlet_sessions</wls:persistent-store-table>
  </wls:session-descriptor>
  <wls:container-descriptor>
 <wls:servlet-reload-check-secs>-1</wls:servlet-reload-check-secs>
 <wls:session-monitoring-enabled>true</wls:session-monitoring-enabled>
 <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
  </wls:container-descriptor>
  <wls:context-root>cognos</wls:context-root>
</wls:weblogic-web-app>
  

说明:

      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页面,该页面会将系统中存在的所有会话信息在页面进行显示。

0
0
分享到:
评论

相关推荐

    weblogic9.2环境部署

    本篇文章将详细阐述如何在Windows环境下部署WebLogic 9.2,包括创建域、启动服务、配置数据源、部署应用以及一些注意事项。 1. **创建WebLogic域** 创建WebLogic域是部署的基础步骤,域包含了WebLogic Server实例...

    weblogic9.2集群部署方法

    WebLogic Server 9.2 的集群部署方法是企业级应用在Windows环境中实现高可用性和负载均衡的关键步骤。本文将详细阐述集群配置的整个过程,包括前期准备、管理服务器的安装以及集群成员的设置。 1.1 群集安装前的...

    WebLogic Server 9.2 集群配置

    【WebLogic Server 9.2 集群配置详解】 WebLogic Server 9.2 集群配置是一项关键的任务,旨在提高应用程序的可用性和可伸缩性。集群是一种将多个独立服务器组织成一个逻辑单元的技术,它们共享工作负载并提供故障...

    linux下weblogic9.2集群安装部署借鉴.pdf

    本文档详细介绍了在 Linux 操作系统下安装和部署 WebLogic 9.2 集群的步骤和注意事项,涵盖了 JDK 安装、环境变量配置、WebLogic 9.2 集群安装准备、集群概念、集群应用的必要条件、配置前的准备工作等内容。...

    Weblogic9.2集群配置手册

    WebLogic Server 9.2 集群配置手册是一份详细的指南,用于帮助用户搭建和配置WebLogic集群,以实现高可用性和负载均衡。WebLogic是Oracle公司的一个企业级Java应用服务器,它提供了管理和部署Java应用程序的平台。...

    weblogic9.2安装过程

    在 Unix 系统下安装 WebLogic 9.2 需要按照特定的步骤进行操作,以确保安装成功。在本文中,我们将详细介绍 WebLogic 9.2 的安装过程,并提供相关的命令和配置信息。 安装 WebLogic 9.2 首先,需要下载 WebLogic ...

    Weblogic9.2集群配置

    本文将详细介绍如何在 WebLogic Server 9.2 上配置集群,以及通过 Proxy Server 访问集群的步骤。 1. 预备知识 - **Domain**:在 WebLogic 中,Domain 是最基本的管理单位,它包含了多个 WebLogic Server 实例、...

    weblogic9.2集群图解.doc

    WebLogic Server 9.2 集群配置详解 本文对 WebLogic Server 9.2 集群配置进行了详细的讲解,涵盖了 Domain 和 Server 的概念、集群体系结构、配置前的准备工作、使用 Domain Configuration Wizard 进行配置等方面的...

    WebLogic9.2安装及配置[定义].pdf

    WebLogic 9.2 安装及配置 WebLogic 9.2 是 BEA Systems 公司开发的一款 Java EE 应用服务器,用于部署和管理 Java EE 应用程序。本文档将指导读者安装和配置 WebLogic 9.2 服务器,解决常见的安装和配置问题。 一...

    weblogic9.2许可文件

    WebLogic Server 在运行时,对并发用户数有特定的限制,这主要是出于版权保护和商业策略的考虑。当你在运营一个大型的、需要处理大量并发用户的业务应用时,这些限制可能会成为阻碍。然而,通过导入特定的许可文件,...

    weblogic 9.2 win32

    - **环境检查**: 在安装WebLogic 9.2之前,确保计算机满足最低硬件要求,例如足够的内存和磁盘空间。 - **兼容性验证**: 验证所使用的操作系统是否与WebLogic 9.2兼容。 - **软件依赖**: 确保已经安装了必要的软件,...

    weblogic9.2的配置及部署

    ### WebLogic 9.2 的配置与部署 #### 一、WebLogic 9.2 概述 WebLogic Server 是一款高性能的企业级 Java 应用服务器,由 Oracle 公司开发并维护。WebLogic 9.2 版本是该系列中的一个重要版本,它提供了强大的...

    weblogic 9.2 for linux

    下载链接在附件中,weblogic 9.2 for linux

Global site tag (gtag.js) - Google Analytics