服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

自己写的一个未成熟的数据库连接池(二)


  /**
   * statement的自封装,屏蔽了getresultset,executequery,getgeneratedkeys方法 返回自己的接管类
   * 目的适记录sql的动作和设置相应连接最后活动时间。
   * @author liudong
   */
  
  package com.drsl.db;
  
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import java.util.date;
  import java.lang.reflect.*;
  import sun.jdbc.odbc.*;
  public class statementobject implements invocationhandler{
    
    private statement stm=null;
    private  statement stm_proxy=null;
    
    private final static string getresultset_method_name = "getresultset";
    private final static string executequery_method_name = "executequery";
    private final static string getgeneratedkeys_method_name = "getgeneratedkeys";
    
    private resultsetobject rso=null;
  
    public statementobject(statement stm){
      this.stm=stm;
    }
    
    public statement getstatement(){
      if(stm_proxy==null){
        classloader classloader=stm.getclass().getclassloader();
        class[] interfaces = stm.getclass().getinterfaces();
        
        if(interfaces==null||interfaces.length==0){
          interfaces = new class[1];
          interfaces[0] = statement.class;
        }
        
        try{
          
          stm_proxy= (statement)proxy.newproxyinstance(classloader,interfaces,this);
          
        }catch(nullpointerexception e){
          log(e,"statementobject getstatement()--error");
        }
        if(stm_proxy!=null)
          log("statementobject getstatement()--success");
      }
      return stm_proxy;
    }
    
    public object invoke(object proxy, method m, object[] args)  throws throwable
    {
      object obj = null;
      log("statementobject--invoke:method: /""+m.getname()+"/"");
      
      //判断是否调用了getresultset or executequery or getgeneratedkeys
      //是就截获
      if(getresultset_method_name.equals(m.getname())
        || executequery_method_name.equals(m.getname())
          || getgeneratedkeys_method_name.equals(m.getname())){
            
        resultset rs=(resultset)m.invoke(stm, args);
        
        if(rs!=null && rso==null){
          rso=new resultsetobject(rs);
          obj=rso.getresultset();
        }else if(rso!=null)
          obj=rso.getresultset();
        else  
          log("statementobject--invoke:method: /""+m.getname()+"/"--失败");
        
      }else{
        obj = m.invoke(stm, args);  
      }
      
      //设置最后一次访问时间,以便及时清除超时的连接
      setlastaccesstime( new date().gettime());
      return obj;
    }
    /**
    * 将文本信息写入日志文件
    */
    private void log(string msg) {
      connectionmanager.log(msg);
    }
    
    /**
    * 将文本信息与异常写入日志文件
    */
    private void log(throwable e, string msg) {
      connectionmanager.log(e,msg);
    }
    
    //设置最后一次访问时间
    private void setlastaccesstime(long ltime){
      connectionobject.setlastaccesstime(ltime);
    }
  
  }
  /////////////////////////////////////////////////////////////////////////////////
  
  
  /**
   * preparedstatement 的自封装,屏蔽了executequery方法 返回自己的接管类
   * 目的适记录sql的动作和设置相应连接最后活动时间。
   * @author liudong
   */
  
  package com.drsl.db;
  
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import java.util.date;
  import java.lang.reflect.*;
  
  public class preparedstatementobject implements invocationhandler{
    
    private preparedstatement ps=null;
    private  preparedstatement ps_proxy =null;
    
    private final static string executequery_method_name = "executequery";
    private resultsetobject rso=null;
  
    
    preparedstatementobject(preparedstatement ps){
      this.ps=ps;
    }
    public preparedstatement getpreparedstatement(){
      if(ps_proxy==null){
        classloader classloader=ps.getclass().getclassloader();
        class[] interfaces = ps.getclass().getinterfaces();
        
        if(interfaces==null||interfaces.length==0){
          interfaces = new class[1];
          interfaces[0] = preparedstatement.class;
        }
    
        try{
  
          ps_proxy= (preparedstatement) proxy.newproxyinstance(classloader,interfaces,this);
          
        }catch(nullpointerexception e){
          log(e,"preparedstatementobject getpreparedstatement()--error");
        }
        if(ps_proxy!=null)
          log("preparedstatementobject getpreparedstatement()--success");
      }
      return ps_proxy;
    }
  
    public object invoke(object proxy, method m, object[] args)  throws throwable
    {
      object obj = null;
      log("preparedstatementobject--invoke:method: /""+m.getname()+"/"");
      
      //是否调用了executequery 如果是 则接管
      if(executequery_method_name.equals(m.getname())){
        
        resultset rs=(resultset)m.invoke(ps, args);
        if(rs!=null && rso==null){
          rso=new resultsetobject(rs);
          obj=rso.getresultset();
        }else if(rso!=null)
          obj=rso.getresultset();
        else
          log("preparedstatementobject--invoke:method: /""+m.getname()+"/"--失败");
      }else{
        obj = m.invoke(ps, args);
      }
      
      obj = m.invoke(ps, args);  
      //设置最后一次访问时间,以便及时清除超时的连接
      setlastaccesstime( new date().gettime());
      return obj;
    }
      /**
    * 将文本信息写入日志文件
    */
    private void log(string msg) {
      connectionmanager.log(msg);
    }
    
    /**
    * 将文本信息与异常写入日志文件
    */
    private void log(throwable e, string msg) {
      connectionmanager.log(e,msg);
    }
    //设置最后一次访问时间
    private void setlastaccesstime(long ltime){
      connectionobject.setlastaccesstime(ltime);
    }
  }
  
  ////////////////////////////////////////////////////////////////////////
  
  /**
   * statement的自封装,屏蔽了getstatement方法 返回自己的接管类
   * 目的适记录sql的动作和设置相应连接最后活动时间。
   * @author liudong
   */
  
  package com.drsl.db;
  
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import java.util.date;
  import java.lang.reflect.*;
  
  public class resultsetobject implements invocationhandler{
    
    private resultset rs=null;
    private  resultset rs_proxy =null

扫描关注微信公众号