知识大全 自己写的一个未成熟的数据库连接池(二)
Posted 时间
篇首语:饭可以一日不吃,觉可以一日不睡,书不可以一日不读本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 自己写的一个未成熟的数据库连接池(二)相关的知识,希望对你有一定的参考价值。
/** * Statement的自封装 屏蔽了getResultSet executeQuery getGeneratedKeys方法 返回自己的接管类 * 目的适记录SQl的动作和设置相应连接最后活动时间 * @author Liudong */ package 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== ) interfaces = new Class[ ]; interfaces[ ] = 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 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== ) interfaces = new Class[ ]; interfaces[ ] = 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 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 cha138/Article/program/Java/hx/201311/26864相关参考