您的位置:首页 >> 编程开发 >> Java >> J2SE >> 正文
J2SE RSS
 

一个基本成熟的数据库连接池(part 2)<修正后>

http://www.rdxx.com 05年07月24日 21:13 JR 我要投稿

//===================这部分是数据库连接和造作类的封装================


  1. /**
  2.  * 数据连接类Connection的自封装,屏蔽了close方法和createStatement,prepareStatement 方法以返回自己的接管类
  3.  * @author zxg
  4.  */
  5. package com.dbaccess.dbpool;
  6. import java.sql.*;
  7. import java.util.Date;
  8. import java.lang.reflect.*;
  9. public class ConnectionObject implements InvocationHandler{
  10.     private final static String CLOSE_METHOD_NAME = "close";
  11.     private final static String CREATSTATMENT_METHOD_NAME = "createStatement";
  12.     private final static String PREPARESTATEMENT_METHOD_NAME = "prepareStatement";
  13.     private Connection conn_proxy=null;
  14.     private PreparedStatementObject pso=null;
  15.     private StatementObject stmo=null;
  16.     public Connection conn = null;
  17.     public String poolName=null;
  18.     //数据库的忙状态
  19.     private boolean inUse = false;
  20.     //用户最后一次访问该连接方法的时间
  21.     private long lastAccessTime = new Date().getTime();
  22.     public ConnectionObject(Connection conn, boolean inUse){
  23.         this.conn = conn;
  24.         this.inUse = inUse;
  25.     }
  26.     /**
  27.      * Returns the conn.
  28.      * @return Connection
  29.      */
  30.     //返回数据库连接conn的接管类,以便截住Connection 的各个方法
  31.     public Connection getConnection(boolean bNewConn) {
  32.         if (bNewConn)
  33.         {
  34.             ClassLoader classloader=conn.getClass().getClassLoader();
  35.             Class[] interfaces = conn.getClass().getInterfaces();
  36.             if(interfaces==null||interfaces.length==0){
  37.                 interfaces = new Class[1];
  38.                 interfaces[0] = Connection.class;
  39.             }
  40.             conn_proxy=null;
  41.             try{
  42.                 conn_proxy= (Connection)Proxy.newProxyInstance(classloader,interfaces,this);
  43.             }catch(NullPointerException e){
  44.                 log(e,"ConnectionObject getConnection()--error");
  45.             }
  46.             if(conn_proxy!=null)
  47.                 log("ConnectionObject getConnection()--success");
  48.         }
  49.         return conn_proxy;
  50.     }
  51.     /**
  52.      * 该方法真正的关闭了数据库的连接
  53.      * @throws SQLException
  54.      */
  55.     synchronized void  close() throws SQLException{
  56.         //由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接
  57.         conn.close();
  58.         conn=null;
  59.     }
  60.     /**
  61.      * Returns the inUse.
  62.      * @return boolean
  63.      */
  64.     public boolean isInUse() {
  65.         return inUse;
  66.     }
  67.     public boolean isClosed() {
  68.         boolean bClosed=false;
  69.         try{
  70.             bClosed=conn.isClosed();
  71.         }catch(SQLException e){
  72.             log(e,"ConnectionObject--isClosed");
  73.             bClosed=false;
  74.         }
  75.         return bClosed;
  76.     }
  77.     /**
  78.      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
  79.      */
  80.     public Object invoke(Object proxy, Method m, Object[] args)
  81.         throws Throwable
  82.     {
  83.         Object obj = null;
  84.         log("ConnectionObject--invoke:Method: \""+m.getName()+"\"");
  85.         //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
  86.         if(CLOSE_METHOD_NAME.equals(m.getName())){
  87.             setInUse(false);
  88.         }else if(CREATSTATMENT_METHOD_NAME.equals(m.getName())){
  89.         //如果调用了 createStatment 的方法,封装 Statement 类接受管理
  90.             try{
  91.                 Statement stm=(Statement) m.invoke(conn, args);
  92.                 stmo=new StatementObject(stm);
  93.                 stmo.setConnectionObject(this);
  94.                 obj=stmo.getStatement();
  95.             }catch(Exception e){
  96.                 obj = m.invoke(conn, args);
  97.                 log(e,"ConnectionObject--invoke:Method: \""+m.getName()+"\"--失败");
  98.             }
  99.         }else if(PREPARESTATEMENT_METHOD_NAME.equals(m.getName())){
  100.         //如果调用了 createStatment 的方法,封装 PreparedStatement 类接受管理
  101.             try{
  102.                 PreparedStatement ps=(PreparedStatement) m.invoke(conn, args);
  103.                 pso=new PreparedStatementObject(ps);
  104.                 pso.setConnectionObject(this);
  105.                 obj=pso.getPreparedStatement();
  106.             }catch(Exception e){
  107.                 obj = m.invoke(conn, args);
  108.                 log(e,"ConnectionObject--invoke:Method: \""+m.getName()+"\"--失败");
  109.             }
  110.         }else
  111.             obj = m.invoke(conn, args);
  112.         //设置最后一次访问时间,以便及时清除超时的连接
  113.         lastAccessTime = new Date().getTime();
  114.         return obj;
  115.     }
  116.     /**
  117.      * Returns the lastAccessTime.
  118.      * @return long
  119.      */
  120.     public long getLastAccessTime() {
  121.         return lastAccessTime;
  122.     }
  123.     /**
  124.      * set the lastAccessTime.
  125.      * @param latimelong
  126.      */
  127.     public void setLastAccessTime(long latime) {
  128.         lastAccessTime=latime;
  129.     }
  130.     /**
  131.      * Sets the inUse.
  132.      * @param inUse The inUse to set
  133.      */
  134.     public void setInUse(boolean inUse) {
  135.         this.inUse = inUse;
  136.     }
  137.     public synchronized void release() {
  138.         try{
  139.             close();
  140.         }catch(SQLException e){
  141.             log(e,"ConnectionObject--release 调用 close 失败");
  142.         }
  143.     }
  144.         /**
  145.     * 将文本信息写入日志文件
  146.     */
  147.     private void log(String msg) {
  148.         msg="POOLMSG:Name:["+poolName+"];Msg:"+msg;
  149.         ConnectionManager.log(msg);
  150.     }
  151.     /**
  152.     * 将文本信息与异常写入日志文件
  153.     */
  154.     private void log(Throwable e, String msg) {
  155.         msg="POOLERR:Name:["+poolName+"];Msg:"+msg;
  156.         ConnectionManager.log(e,msg);
  157.     }
  158.     public void setPoolName(String pn){
  159.         poolName=pn;
  160.     }
  161.     public String getPoolName(){
  162.         return poolName;
  163.     }
  164. }
  165. /**
  166.  * Statement的自封装,屏蔽了getResultSet,executeQuery,getGeneratedKeys方法 返回自己的接管类
  167.  * 目的适记录SQl的动作和设置相应连接最后活动时间。
  168.  * @author Liudong
  169.  */
  170. package com.dbaccess.dbpool;
  171. import java.sql.*;
  172. import java.util.Date;
  173. import java.lang.reflect.*;
  174. public class StatementObject implements InvocationHandler{
  175.     
  176.     private Statement stm=null;
  177.     private Statement stm_proxy=null;
  178.     
  179.     private ConnectionObject connoj=null;
  180.     
  181.     private final static String GETRESULTSET_METHOD_NAME = "getResultSet";
  182.     private final static String EXECUTEQUERY_METHOD_NAME = "executeQuery";
  183.     private final static String GETGENERATEDKEYS_METHOD_NAME = "getGeneratedKeys";
  184.     
  185.     private ResultSetObject rso=null;
  186.     public StatementObject(Statement stm){
  187.         this.stm=stm;
  188.     }
  189.     
  190.     public Statement getStatement(){
  191.         ClassLoader classloader=stm.getClass().getClassLoader();
  192.         Class[] interfaces = stm.getClass().getInterfaces(); 
  193.         
  194.         if(interfaces==null||interfaces.length==0){ 
  195.             interfaces = new Class[1]; 
  196.             interfaces[0] = Statement.class
  197.         }
  198.         if (stm_proxy!=null)  stm_proxy=null;
  199.         try{
  200.              
  201.             stm_proxy= (Statement)Proxy.newProxyInstance(classloader,interfaces,this);
  202.             
  203.         }catch(NullPointerException e){
  204.             log(e,"StatementObject getStatement()--error");
  205.         }
  206.         if(stm_proxy!=null)
  207.             log("StatementObject getStatement()--success");
  208.         return stm_proxy;
  209.     }
  210.     
  211.     public Object invoke(Object proxy, Method m, Object[] args)    throws Throwable 
  212.     {
  213.         Object obj = null;
  214.         log("StatementObject--invoke:Method: \""+m.getName()+"\"");
  215.          
  216.         //判断是否调用了getResultSet or executeQuery or getGeneratedKeys
  217.         //是就截获
  218.         if(GETRESULTSET_METHOD_NAME.equals(m.getName()) 
  219.             || EXECUTEQUERY_METHOD_NAME.equals(m.getName())
  220.                 || GETGENERATEDKEYS_METHOD_NAME.equals(m.getName())){
  221.             try{
  222.                 ResultSet rs=(ResultSet)m.invoke(stm, args);
  223.                 rso=new ResultSetObject(rs);
  224.                 rso.setConnectionObject(connoj);
  225.                 obj=rso.getResultSet();
  226.                 
  227.             }catch(Exception e){
  228.                 obj = m.invoke(stm, args);
  229.                 log(e,"StatementObject--invoke:Method: \""+m.getName()+"\"--失败");
  230.             
  231.             }
  232.         }else{
  233.             obj = m.invoke(stm, args);    
  234.         }
  235.         
  236.         
  237.         //设置最后一次访问时间,以便及时清除超时的连接
  238.         setLastAccessTime( new Date().getTime());
  239.         return obj;
  240.     }
  241.     /**
  242.     * 将文本信息写入日志文件
  243.     */
  244.     private void log(String msg) {
  245.         msg="POOLMSG:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  246.         ConnectionManager.log(msg);
  247.     }
  248.     
  249.     /**
  250.     * 将文本信息与异常写入日志文件
  251.     */
  252.     private void log(Throwable e, String msg) {
  253.         msg="POOLERR:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  254.         ConnectionManager.log(e,msg);
  255.     }
  256.     
  257.     //设置最后一次访问时间
  258.     private void setLastAccessTime(long ltime){
  259.         connoj.setLastAccessTime(ltime);
  260.     }
  261.     public void setConnectionObject(ConnectionObject cnoj){
  262.         connoj=cnoj;
  263.     }
  264. }
  265. /**
  266.  * PreparedStatement 的自封装,屏蔽了executeQuery方法 返回自己的接管类
  267.  * 目的适记录SQl的动作和设置相应连接最后活动时间。
  268.  * @author Liudong
  269.  */
  270. package com.dbaccess.dbpool;
  271. import java.sql.*;
  272. import java.util.Date;
  273. import java.lang.reflect.*;
  274. public class PreparedStatementObject implements InvocationHandler{
  275.     
  276.     private PreparedStatement ps=null;
  277.     private    PreparedStatement ps_proxy =null;
  278.     private ConnectionObject connoj=null;    
  279.     private final static String EXECUTEQUERY_METHOD_NAME = "executeQuery";
  280.     private ResultSetObject rso=null;
  281.     
  282.     PreparedStatementObject(PreparedStatement ps){
  283.         this.ps=ps;
  284.     }
  285.     public PreparedStatement getPreparedStatement(){
  286.         ClassLoader classloader=ps.getClass().getClassLoader();
  287.         Class[] interfaces = ps.getClass().getInterfaces(); 
  288.         
  289.         if(interfaces==null||interfaces.length==0){ 
  290.             interfaces = new Class[1]; 
  291.             interfaces[0] = PreparedStatement.class
  292.         } 
  293.         if (ps_proxy!=null)  ps_proxy=null;        
  294.         try{
  295.             ps_proxy= (PreparedStatementProxy.newProxyInstance(classloader,interfaces,this);
  296.             
  297.         }catch(NullPointerException e){
  298.             log(e,"PreparedStatementObject getPreparedStatement()--error");
  299.         }
  300.         if(ps_proxy!=null)
  301.             log("PreparedStatementObject getPreparedStatement()--success");
  302.         return ps_proxy;
  303.     }
  304.     public Object invoke(Object proxy, Method m, Object[] args)    throws Throwable 
  305.     {
  306.         Object obj = null;
  307.         log("PreparedStatementObject--invoke:Method: \""+m.getName()+"\"");
  308.         
  309.         //是否调用了executeQuery 如果是 则接管
  310.         if(EXECUTEQUERY_METHOD_NAME.equals(m.getName())){
  311.             try{
  312.                 ResultSet rs=(ResultSet)m.invoke(ps, args);
  313.                 rso=new ResultSetObject(rs);
  314.                 rso.setConnectionObject(connoj);
  315.                 obj=rso.getResultSet();
  316.             }catch(Exception e){
  317.                 obj = m.invoke(ps, args);
  318.                 log(e,"PreparedStatementObject--invoke:Method: \""+m.getName()+"\"--失败");
  319.             }
  320.         }else{
  321.             obj = m.invoke(ps, args);
  322.         }
  323.         
  324.         obj = m.invoke(ps, args);    
  325.         //设置最后一次访问时间,以便及时清除超时的连接
  326.         setLastAccessTime( new Date().getTime());
  327.         return obj;
  328.     }
  329.     /**
  330.     * 将文本信息写入日志文件
  331.     */
  332.     private void log(String msg) {
  333.         msg="POOLMSG:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  334.         ConnectionManager.log(msg);
  335.     }
  336.     
  337.     /**
  338.     * 将文本信息与异常写入日志文件
  339.     */
  340.     private void log(Throwable e, String msg) {
  341.         msg="POOLERR:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  342.         ConnectionManager.log(e,msg);
  343.     }
  344.     //设置最后一次访问时间
  345.     private void setLastAccessTime(long ltime){
  346.         connoj.setLastAccessTime(ltime);
  347.     }
  348.     public void setConnectionObject(ConnectionObject cnoj){
  349.         connoj=cnoj;
  350.     }
  351. }
  352. /**
  353.  *ResultSet 的自封装,屏蔽了getStatement,getMetaData,getString 方法 返回自己的接管类
  354.  * 目的适记录SQl的动作和设置相应连接最后活动时间。
  355.  * @author Liudong
  356.  */
  357. package com.dbaccess.dbpool;
  358. import java.sql.*;
  359. import java.util.Date;
  360. import java.lang.reflect.*;
  361. public class ResultSetObject implements InvocationHandler{
  362.     private ResultSet rs=null;
  363.     private ResultSet rs_proxy =null;
  364.     private ConnectionObject connoj=null;
  365.     private final static String GETSTATEMENT_METHOD_NAME = "getStatement";
  366.     private final static String GETMETADATA_METHOD_NAME = "getMetaData";
  367.     private StatementObject stmo=null;
  368.     private ResultSetMetaDataObject rsdmo=null;
  369.     public ResultSetObject(ResultSet rs){
  370.         this.rs=rs;
  371.     }
  372.     public ResultSet getResultSet(){
  373.         ClassLoader classloader=rs.getClass().getClassLoader();
  374.         Class[] interfaces = rs.getClass().getInterfaces();
  375.         if(interfaces==null||interfaces.length==0){
  376.             interfaces = new Class[1];
  377.             interfaces[0] = ResultSet.class;
  378.         }
  379.         if(rs_proxy!=null) rs_proxy =null;
  380.         try{
  381.             rs_proxy =(ResultSet)Proxy.newProxyInstance(classloader,interfaces,this);
  382.         }catch(NullPointerException e){
  383.             log(e,"ResultSetObject getResultSet()--error");
  384.         }
  385.         if(rs_proxy!=null)
  386.             log("ResultSet getResultSet()--success");
  387.         return rs_proxy;
  388.     }
  389.     public Object invoke(Object proxy, Method m, Object[] args)    throws Throwable
  390.     {
  391.         Object obj = null;
  392.         log("ResultSetObject--invoke:Method: \""+m.getName()+"\"");
  393.         //是否执行getStatement,返回Statement 的接管类
  394.         if(GETSTATEMENT_METHOD_NAME.equals(m.getName())){
  395.             try{
  396.                 Statement stm=(Statement)m.invoke(rs,args);
  397.                 if (stmo!=null) stmo=null;
  398.                 stmo=new StatementObject(stm);
  399.                 stmo.setConnectionObject(connoj);
  400.                 obj=stmo.getStatement();
  401.             }catch(Exception e){
  402.                 obj=m.invoke(rs,args);
  403.                 log(e,"ResultSetObject--invoke:Method: \""+m.getName()+"\"--失败");
  404.             }
  405.         }else if(GETMETADATA_METHOD_NAME.equals(m.getName())){
  406.             try{
  407.                 ResultSetMetaData rsdm=(ResultSetMetaData)m.invoke(rs, args);
  408.                 if (rsdmo!=null) rsdmo=null;
  409.                 rsdmo=new ResultSetMetaDataObject(rsdm);
  410.                 rsdmo.setConnectionObject(connoj);
  411.                 obj = rsdmo.getMetaData();
  412.             }catch(Exception e){
  413.                 obj=m.invoke(rs,args);
  414.                 log(e,"ResultSetObject--invoke:Method: \""+m.getName()+"\"--失败");
  415.             }
  416.         }else if(m.getName().equals("getString")){
  417.             try{
  418.                 Class paramTypes[]=m.getParameterTypes();
  419.                 Class paramType = paramTypes[0];
  420.                 String paramName=paramType.getName();
  421.                 //debug
  422.             //    log(paramName);
  423.                 if(paramName.indexOf("string")!=-1 ||
  424.                 paramName.indexOf("String")!=-1){
  425.                     String    parm=(String)args[0];
  426.                     //debug
  427.                 //    log(parm);
  428.                     String character=getCharacter(connoj.getPoolName());
  429.                     obj=new String(rs.getBytes(parm),character);
  430.                 }else{
  431.                     Object oi=args[0];
  432.                     String si=oi.toString();
  433.                     //debug
  434.                 //    log(si);
  435.                     int i=Integer.parseInt(si);
  436.                     String character=getCharacter(connoj.getPoolName());
  437.                     obj=new String(rs.getBytes(i),character);
  438.                 }
  439.             }catch(Exception e){
  440.                 obj=m.invoke(rs,args);
  441.                 log(e,"ResultSetObject--invoke:Method: \""+m.getName()+"\"--失败");
  442.             }
  443.         }else
  444.             obj=m.invoke(rs,args);
  445.         //设置最后一次访问时间,以便及时清除超时的连接
  446.         setLastAccessTime( new Date().getTime());
  447.         return obj;
  448.     }
  449.     /**
  450.     * 将文本信息写入日志文件
  451.     */
  452.     private void log(String msg) {
  453.         msg="POOLMSG:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  454.         ConnectionManager.log(msg);
  455.     }
  456.     /**
  457.     * 将文本信息与异常写入日志文件
  458.     */
  459.     private void log(Throwable e, String msg) {
  460.         msg="POOLERR:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  461.         ConnectionManager.log(e,msg);
  462.     }
  463.     private String getCharacter(String poolName) {
  464.         return ConnectionManager.getCharacter(poolName);
  465.     }
  466.     //设置最后一次访问时间
  467.     private void setLastAccessTime(long ltime){
  468.         connoj.setLastAccessTime(ltime);
  469.     }
  470.     //关联所使用得连接。
  471.     public void setConnectionObject(ConnectionObject cnoj){
  472.         connoj=cnoj;
  473.     }
  474. }
  475. /**
  476.  * ResultSetMetaData 的自封装,屏蔽了executeQuery方法 返回自己的接管类
  477.  * 目的适记录SQl的动作和设置相应连接最后活动时间。
  478.  * @author Liudong
  479.  */
  480. package com.dbaccess.dbpool;
  481. import java.sql.*;
  482. import java.util.Date;
  483. import java.lang.reflect.*;
  484. public class ResultSetMetaDataObject implements InvocationHandler{
  485.     
  486.     private ResultSetMetaData rsmd=null;
  487.     private    ResultSetMetaData rsmd_proxy =null;
  488.     //
  489.     private ConnectionObject connoj=null;
  490.     public ResultSetMetaDataObject(ResultSetMetaData rsmd){
  491.         this.rsmd=rsmd;
  492.     }
  493.     public ResultSetMetaData getMetaData(){
  494.         ClassLoader classloader=rsmd.getClass().getClassLoader();
  495.         Class[] interfaces = rsmd.getClass().getInterfaces(); 
  496.         
  497.         if(interfaces==null||interfaces.length==0){ 
  498.             interfaces = new Class[1]; 
  499.             interfaces[0] = ResultSetMetaData.class
  500.         } 
  501.         if (rsmd_proxy!=null)  rsmd_proxy=null;
  502.         try{
  503.             rsmd_proxy= (ResultSetMetaDataProxy.newProxyInstance(classloader,interfaces,this);
  504.             
  505.         }catch(NullPointerException e){
  506.             log(e,"ResultSetMetaDataObject getPreparedStatement()--error");
  507.         }
  508.         if(rsmd_proxy!=null)
  509.             log("ResultSetMetaDataObject getPreparedStatement()--success");
  510.         
  511.         return rsmd_proxy;
  512.     }
  513.     public Object invoke(Object proxy, Method m, Object[] args)    throws Throwable 
  514.     {
  515.         Object obj = null;
  516.         
  517.         log("ResultSetMetaDataObject--invoke:Method: \""+m.getName()+"\"");
  518.                 
  519.         obj = m.invoke(rsmd, args);    
  520.         
  521.         //设置最后一次访问时间,以便及时清除超时的连接
  522.         
  523.         setLastAccessTime( new Date().getTime());
  524.         
  525.         return obj;
  526.     }
  527.         /**
  528.     * 将文本信息写入日志文件
  529.     */
  530.     private void log(String msg) {
  531.         msg="POOLMSG:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  532.         ConnectionManager.log(msg);
  533.     }
  534.     
  535.     /**
  536.     * 将文本信息与异常写入日志文件
  537.     */
  538.     private void log(Throwable e, String msg) {
  539.         msg="POOLERR:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  540.         ConnectionManager.log(e,msg);
  541.     }
  542.     //设置最后一次访问时间
  543.     private void setLastAccessTime(long ltime){
  544.         connoj.setLastAccessTime(ltime);
  545.     }
  546.     public void setConnectionObject(ConnectionObject cnoj){
  547.         connoj=cnoj;
  548.     }
  549. }
  550. /**
  551.  * CallableStatement 的自封装,屏蔽了executeQuery getGeneratedKeys getMetaData 方法 返回自己的接管类
  552.  * 目的是记录SQl的动作和设置相应连接最后活动时间。
  553.  * @author Liudong
  554.  */
  555. package com.dbaccess.dbpool;
  556. import java.sql.*;
  557. import java.util.Date;
  558. import java.lang.reflect.*;
  559. public class CallableStatementObject implements InvocationHandler{
  560.     
  561.     
  562.     private CallableStatement cs=null;
  563.     private CallableStatement cs_proxy =null;
  564.     private ConnectionObject connoj=null;
  565.     
  566.     private final static String EXECUTEQUERY_METHOD_NAME = "executeQuery";
  567.     private final static String GETRESULTSET_METHOD_NAME = "getResultSet";
  568.     private final static String GETGENERATEDKEYS_METHOD_NAME = "getGeneratedKeys";
  569.     private final static String GETMETADATA_METHOD_NAME = "getMetaData";
  570.     
  571.     private ResultSetObject rso=null;
  572.     private ResultSetMetaDataObject rsmdo=null;
  573.     
  574.     CallableStatementObject(CallableStatement cs){
  575.         this.cs=cs;
  576.     }
  577.     public CallableStatement getCallableStatement(){
  578.         ClassLoader classloader=cs.getClass().getClassLoader();
  579.         Class[] interfaces = cs.getClass().getInterfaces(); 
  580.         
  581.         if(interfaces==null||interfaces.length==0){ 
  582.             interfaces = new Class[1]; 
  583.             interfaces[0] = CallableStatement.class
  584.         } 
  585.         try{
  586.             cs_proxy= (CallableStatementProxy.newProxyInstance(classloader,interfaces,this);
  587.             
  588.         }catch(NullPointerException e){
  589.             log(e,"CallableStatementObject getCallableStatement()--error");
  590.         }
  591.         if(cs_proxy!=null)
  592.             log("CallableStatementObject getCallableStatement()--success");
  593.         return cs_proxy;
  594.     }
  595.     public Object invoke(Object proxy, Method m, Object[] args)    throws Throwable 
  596.     {
  597.         Object obj = null;
  598.         log("CallableStatementObject--invoke:Method: \""+m.getName()+"\"");
  599.         
  600.         //是否调用了executeQuery || getGeneratedKeys 如果是 则接管
  601.         if(EXECUTEQUERY_METHOD_NAME.equals(m.getName()) ||
  602.            GETGENERATEDKEYS_METHOD_NAME.equals(m.getName())||
  603.            GETRESULTSET_METHOD_NAME.equals(m.getName())){
  604.                try{
  605.                 ResultSet rs=(ResultSet)m.invoke(cs, args);
  606.                 rso=new ResultSetObject(rs);
  607.                 rso.setConnectionObject(connoj);
  608.                 obj=rso.getResultSet();
  609.                }catch(Exception e){
  610.                    obj=m.invoke(cs, args);
  611.                    log(e,"CallableStatementObject--invoke:Method: \""+m.getName()+"\"--失败");
  612.                }
  613.         }else if(GETMETADATA_METHOD_NAME.equals(m.getName())){
  614.             try{
  615.                 
  616.                 ResultSetMetaData rsmd=(ResultSetMetaData)m.invoke(cs, args);            
  617.                 rsmdo=new ResultSetMetaDataObject(rsmd);
  618.                 rsmdo.setConnectionObject(connoj);
  619.                 obj=rsmdo.getMetaData();
  620.                 
  621.             }catch(Exception e){
  622.                 obj=m.invoke(cs, args);
  623.                 log(e,"CallableStatementObject--invoke:Method: \""+m.getName()+"\"--失败");
  624.             }
  625.         }else if(m.getName().equals("getString")){
  626.             try{
  627.                 
  628.                 Class paramTypes[]=m.getParameterTypes();
  629.                 Class paramType = paramTypes[0];
  630.                 String paramName=paramType.getName();
  631.                 //debug
  632.             //    log(paramName);
  633.                 
  634.                 if(paramName.indexOf("string")!=-1 ||
  635.                 paramName.indexOf("String")!=-1){
  636.             
  637.                     
  638.                     String    parm=(String)args[0];
  639.                     //debug
  640.                 //    log(parm);
  641.                     String character=getCharacter(connoj.getPoolName());
  642.                     
  643.                     obj=new String(cs.getBytes(parm),character);
  644.                 }else{
  645.                     
  646.                     Object oi=args[0];
  647.                     
  648.                     String si=oi.toString();
  649.                     //debug
  650.                 //    log(si);
  651.                     
  652.                     int i=Integer.parseInt(si);
  653.                     String character=getCharacter(connoj.getPoolName());
  654.                     obj=new String(cs.getBytes(i),character);
  655.                 }                
  656.             }catch(Exception e){
  657.                 
  658.                 log(e,"CallableStatementObject--invoke:Method: \""+m.getName()+"\"--失败");
  659.                 
  660.                 obj=m.invoke(cs,args);
  661.             }
  662.         }else
  663.             obj = m.invoke(cs, args);    
  664.         //设置最后一次访问时间,以便及时清除超时的连接
  665.         setLastAccessTime( new Date().getTime());
  666.         return obj;
  667.     }
  668.         /**
  669.     * 将文本信息写入日志文件
  670.     */
  671.     private void log(String msg) {
  672.         msg="POOLMSG:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  673.         ConnectionManager.log(msg);
  674.     }
  675.     
  676.     /**
  677.     * 将文本信息与异常写入日志文件
  678.     */
  679.     private void log(Throwable e, String msg) {
  680.         msg="POOLERR:Name:["+connoj.getPoolName()+"];Msg:"+msg;
  681.         ConnectionManager.log(e,msg);
  682.     }
  683.     //设置最后一次访问时间
  684.     private void setLastAccessTime(long ltime){
  685.         connoj.setLastAccessTime(ltime);
  686.     }
  687.     public void setConnectionObject(ConnectionObject cnoj){
  688.         connoj=cnoj;
  689.     }
  690.     private String getCharacter(String poolName) {
  691.         
  692.         return ConnectionManager.getCharacter(poolName);
  693.     }
  694. }

 
 
标签: 修正 , 基本 , 数据库连接池 , 数据 , 连接 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站