** * 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; private final static String GETSTATEMENT_METHOD_NAME = "getStatement"; private final static String GETMETADATA_METHOD_NAME = "getMetaData"; private StatementObject stmo=null; private ResultSetMetaDataObject rsdmo=null;
public ResultSetObject(ResultSet rs){ this.rs=rs; } public ResultSet getResultSet(){ if(rs_proxy==null){ ClassLoader classloader=rs.getClass().getClassLoader(); Class[] interfaces = rs.getClass().getInterfaces(); if(interfaces==null||interfaces.length==0){ interfaces = new Class[1]; interfaces[0] = ResultSet.class; } try{ rs_proxy =(ResultSet)Proxy.newProxyInstance(classloader,interfaces,this); }catch(NullPointerException e){ log(e,"ResultSetObject getResultSet()--error"); } if(rs_proxy!=null) log("ResultSet getResultSet()--success"); } return rs_proxy; } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; log("ResultSetObject--invoke:Method: /""+m.getName()+"/""); //是否执行getStatement,返回Statement 的接管类 if(GETSTATEMENT_METHOD_NAME.equals(m.getName())){ Statement stm=(Statement)m.invoke(rs,args); if(stm!=null && stmo==null){ stmo=new StatementObject(stm); obj=stmo.getStatement(); }else if(stmo !=null) obj=stmo.getStatement(); else log("ResultSetObject--invoke:Method: /""+m.getName()+"/"--失败"); }else if(GETMETADATA_METHOD_NAME.equals(m.getName())){ ResultSetMetaData rsdm=(ResultSetMetaData)m.invoke(rs, args); if(rsdm!=null && rsdmo==null){ rsdmo=new ResultSetMetaDataObject(rsdm); obj = rsdmo.getMetaData(); }else if(rsdmo!=null) obj = rsdmo.getMetaData(); else log("ResultSetObject--invoke:Method: /""+m.getName()+"/"--失败"); }else obj=m.invoke(rs,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); } } ////////////////////////////////////////////////////////////////////////////
/** * ResultSetMetaData 的自封装,屏蔽了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 ResultSetMetaDataObject implements InvocationHandler{ private ResultSetMetaData rsmd=null; private ResultSetMetaData rsmd_proxy =null; // public ResultSetMetaDataObject(ResultSetMetaData rsmd){ this.rsmd=rsmd; } public ResultSetMetaData getMetaData(){ if(rsmd_proxy==null){ ClassLoader classloader=rsmd.getClass().getClassLoader(); Class[] interfaces = rsmd.getClass().getInterfaces(); if(interfaces==null||interfaces.length==0){ interfaces = new Class[1]; interfaces[0] = ResultSetMetaData.class; } try{
rsmd_proxy= (ResultSetMetaData) Proxy.newProxyInstance(classloader,interfaces,this); }catch(NullPointerException e){ log(e,"ResultSetMetaDataObject getPreparedStatement()--error"); } if(rsmd_proxy!=null) log("ResultSetMetaDataObject getPreparedStatement()--success"); } return rsmd_proxy; }
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; log("ResultSetMetaDataObject--invoke:Method: /""+m.getName()+"/""); obj = m.invoke(rsmd, 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); } } ////////////////////////////////////////////////////////////////////////////////
/** * CallableStatement 的自封装,屏蔽了executeQuery getGeneratedKeys getMetaData 方法 返回自己的接管类 * 目的是记录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 CallableStatementObject implements InvocationHandler{
private CallableStatement cs=null; private CallableStatement cs_proxy =null; private final static String EXECUTEQUERY_METHOD_NAME = "executeQuery"; private final static String GETGENERATEDKEYS_METHOD_NAME = "getGeneratedKeys"; private final static String GETMETADATA_METHOD_NAME = "getMetaData"; private ResultSetObject rso=null; private ResultSetMetaDataObject rsmdo=null; CallableStatementObject(CallableStatement cs){ this.cs=cs; } public CallableStatement getCallableStatement(){ if(cs_proxy==null){ ClassLoader classloader=cs.getClass().getClassLoader(); Class[] interfaces = cs.getClass().getInterfaces(); if(interfaces==null||interfaces.length==0){ interfaces = new Class[1]; interfaces[0] = CallableStatement.class; } try{
cs_proxy= (CallableStatement) Proxy.newProxyInstance(classloader,interfaces,this); }catch(NullPointerException e){ log(e,"CallableStatementObject getCallableStatement()--error"); } if(cs_proxy!=null) log("CallableStatementObject getCallableStatement()--success"); } return cs_proxy; }
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; log("CallableStatementObject--invoke:Method: /""+m.getName()+"/""); //是否调用了executeQuery || getGeneratedKeys 如果是 则接管 if(EXECUTEQUERY_METHOD_NAME.equals(m.getName()) || GETGENERATEDKEYS_METHOD_NAME.equals(m.getName())){ ResultSet rs=(ResultSet)m.invoke(cs, args); if(rs!=null && rso==null){ rso=new ResultSetObject(rs); obj=rso.getResultSet(); }else if(rso!=null) obj=rso.getResultSet(); else log("CallableStatementObject--invoke:Method: /""+m.getName()+"/"--失败"); }else if(GETMETADATA_METHOD_NAME.equals(m.getName())){ ResultSetMetaData rsmd=(ResultSetMetaData)m.invoke(cs, args); if(rsmd!=null && rsmdo==null){ rsmdo=new ResultSetMetaDataObject(rsmd); obj=rsmdo.getMetaData(); }else if(rsmdo!=null) obj=rsmdo.getMetaData(); else log("CallableStatementObject--invoke:Method: /""+m.getName()+"/"--失败"); }else obj = m.invoke(cs, 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); }
}
|