/**
* 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
闽公网安备 35060202000074号