中间件服务断数据库会话关闭代码(java)

时间:2022-03-18 03:55:35

*****************************************Java类******************************************

package com.taiji.waf.filter;

import java.net.InetAddress;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import  javax.servlet.ServletContextAttributeEvent; 
import  javax.servlet.ServletContextAttributeListener; 
import  javax.servlet.ServletContextEvent; 
import  javax.servlet.ServletContextListener; 

import com.taiji.waf.WAFConfigure;


/** 
 * ServletContext对象监听器.<br> 
 * 作用:监听ServletContext对象生命周期及ServletContext对象中属性变化情况 
 *  
 */ 
public   class  ContextListener  implements  ServletContextListener, 
        ServletContextAttributeListener { 

     /** 
     * 当应用关闭时将执行此方法 
     */ 
     public   void  contextDestroyed(ServletContextEvent arg0) {
             System.out.println( "【监听到】应用被关闭!" );
             closeDataConn();
    } 

     /** 
     * 当应用启动时将执行此方法 
     */ 
     public   void  contextInitialized(ServletContextEvent arg0) { 
         System.out.println( "【监听到】应用被启动!" ); 
    } 

     /** 
     * 当ServletContext对象中新增属性时将执行此方法 
     */ 
     public   void  attributeAdded(ServletContextAttributeEvent arg0) { 
         System.out.println( "【监听到】ServletContext对象中新增一名为"  + arg0.getName() 
                +  "的属性,其属性值为:"  + arg0.getValue()); 
    } 

     /** 
     * 当ServletContext对象中删除属性时将执行此方法 
     */ 
     public   void  attributeRemoved(ServletContextAttributeEvent arg0) { 
         System.out.println( "【监听到】ServletContext对象中一名为"  + arg0.getName() 
                +  "的属性被删除!" ); 
    } 

     /** 
     * 当ServletContext对象中更新属性时将执行此方法 
     */ 
     public   void  attributeReplaced(ServletContextAttributeEvent arg0) { 
         System.out.println( "【监听到】ServletContext对象中一名为"  + arg0.getName() 
                +  "的属性被更新!" ); 
    } 
     /**
      * 获得计算机名称
      * @return
      */
     public static String getHostName(){  
         String hostName="";
         try{  
             InetAddress addr = InetAddress.getLocalHost();   
             hostName=addr.getHostName().toString(); //获取本机计算机名称   

         }catch(Exception e){  
             e.printStackTrace();  
         }  
         return hostName;
     }
     /**
      * 关闭所有数据库连接
      */
     private static void closeDataConn() {
        String name=getHostName();
        String sql=closeDataConn(name);
        String driverClass = WAFConfigure.getProperty("Broker_driver");
        String url = WAFConfigure.getProperty("Broker_url");
        String user= WAFConfigure.getProperty("Broker_username");
        String password = WAFConfigure.getProperty("Broker_password");
        Connection conn =null;
        try {
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url,user,password);
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.executeUpdate();
            pstmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 拼写关闭所有当前用户建立的数据库联接SQL
     * @param ownuserId
     */
    public static String  closeDataConn(String ownuserId){
        String sql=" declare cursor cur_sess is select sid, serial# from v$session where status = 'INACTIVE'";
        sql+=" and type  != 'BACKGROUD' and (machine=? or machine='localhost');  w_sid number; w_serial number; begin open cur_sess; loop fetch cur_sess into w_sid,w_serial; if cur_sess%notfound then exit;  end if;";
        sql+=" execute immediate 'alter system kill session '''||w_sid||','||w_serial||''''; end loop; end;";
        return sql;
    }
} 

*****************************************相应的配置要求******************************************

Web.xml应添加

 <listener>
         <listener-class>
            com.taiji.waf.filter.ContextListener
         </listener-class>
 </listener>

类中的数据库连接是通过读取property文件内容得到的:

Broker_driver=oracle.jdbc.driver.OracleDriver
Broker_url=jdbc:oracle:thin:@172.25.13.102:1521:dxoa1
Broker_username=dxmh
Broker_password=dxmh


改成和自己项目相应的数据库连接和用户的取法即可。