ConnectionWrapper.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:25k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc.jdbc2.optional;
  16. import java.sql.Connection;
  17. import java.sql.ResultSet;
  18. import java.sql.SQLException;
  19. import java.sql.Savepoint;
  20. import java.sql.Statement;
  21. /**
  22.  * This class serves as a wrapper for the org.gjt.mm.mysql.jdbc2.Connection
  23.  * class.   It is returned to the application server which may wrap it again
  24.  * and then return it to the application client in response to
  25.  * dataSource.getConnection().
  26.  * 
  27.  * <p>
  28.  * All method invocations are forwarded to org.gjt.mm.mysql.jdbc2.Connection
  29.  * unless the close method was previously called, in which case a sqlException
  30.  * is  thrown.  The close method performs a 'logical close' on the connection.
  31.  * </p>
  32.  * 
  33.  * <p>
  34.  * All sqlExceptions thrown by the physical connection are intercepted and sent
  35.  * to  connectionEvent listeners before being thrown to client.
  36.  * </p>
  37.  *
  38.  * @author Todd Wolff todd.wolff_at_prodigy.net
  39.  *
  40.  * @see org.gjt.mm.mysql.jdbc2.Connection
  41.  * @see org.gjt.mm.mysql.jdbc2.optional.MysqlPooledConnection
  42.  */
  43. class ConnectionWrapper extends WrapperBase implements Connection {
  44.     private Connection mc = null;
  45.     private MysqlPooledConnection mpc = null;
  46.     private String invalidHandleStr = "Logical handle no longer valid";
  47.     private boolean closed;
  48.     /**
  49.      * Construct a new LogicalHandle and set instance variables
  50.      *
  51.      * @param mysqlPooledConnection reference to object that instantiated this
  52.      *        object
  53.      * @param mysqlConnection physical connection to db
  54.      *
  55.      * @throws SQLException if an error occurs.
  56.      */
  57.     public ConnectionWrapper(MysqlPooledConnection mysqlPooledConnection,
  58.         Connection mysqlConnection) throws SQLException {
  59.         this.mpc = mysqlPooledConnection;
  60.         this.mc = mysqlConnection;
  61.         this.closed = false;
  62.         this.pooledConnection = this.mpc;
  63.     }
  64.     /**
  65.      * Passes call to method on physical connection instance.  Notifies
  66.      * listeners of any caught exceptions before re-throwing to client.
  67.      *
  68.      * @see java.sql.Connection#setAutoCommit
  69.      */
  70.     public void setAutoCommit(boolean autoCommit) throws SQLException {
  71.         if (closed) {
  72.             throw new SQLException(invalidHandleStr);
  73.         } else {
  74.             try {
  75.                 mc.setAutoCommit(autoCommit);
  76.             } catch (SQLException sqlException) {
  77.                 checkAndFireConnectionError(sqlException);
  78.             }
  79.         }
  80.     }
  81.     /**
  82.      * Passes call to method on physical connection instance.  Notifies
  83.      * listeners of any caught exceptions before re-throwing to client.
  84.      *
  85.      * @see java.sql.Connection#getAutoCommit()
  86.      */
  87.     public boolean getAutoCommit() throws SQLException {
  88.         if (closed) {
  89.             throw new SQLException(invalidHandleStr);
  90.         } else {
  91.             try {
  92.                 return mc.getAutoCommit();
  93.             } catch (SQLException sqlException) {
  94. checkAndFireConnectionError(sqlException);
  95.             }
  96.         }
  97.         
  98.         return false; // we don't reach this code, compiler can't tell
  99.     }
  100.     /**
  101.      * Passes call to method on physical connection instance.  Notifies
  102.      * listeners of any caught exceptions before re-throwing to client.
  103.      *
  104.      * @see java.sql.Connection#setCatalog()
  105.      */
  106.     public void setCatalog(String catalog) throws SQLException {
  107.         if (closed) {
  108.             throw new SQLException(invalidHandleStr);
  109.         } else {
  110.             try {
  111.                 mc.setCatalog(catalog);
  112.             } catch (SQLException sqlException) {
  113. checkAndFireConnectionError(sqlException);
  114.             }
  115.         }
  116.     }
  117.     /**
  118.      * Passes call to method on physical connection instance.  Notifies
  119.      * listeners of any caught exceptions before re-throwing to client.
  120.      *
  121.      * @return the current catalog
  122.      *
  123.      * @throws SQLException if an error occurs
  124.      */
  125.     public String getCatalog() throws SQLException {
  126.         if (closed) {
  127.             throw new SQLException(invalidHandleStr);
  128.         } else {
  129.             try {
  130.                 return mc.getCatalog();
  131.             } catch (SQLException sqlException) {
  132. checkAndFireConnectionError(sqlException);
  133.             }
  134.         }
  135.         
  136.         return null; // we don't reach this code, compiler can't tell
  137.     }
  138.     /**
  139.      * Passes call to method on physical connection instance.  Notifies
  140.      * listeners of any caught exceptions before re-throwing to client.
  141.      *
  142.      * @see java.sql.Connection#isClosed()
  143.      */
  144.     public boolean isClosed() throws SQLException {
  145.         return (closed || mc.isClosed());
  146.     }
  147.     /**
  148.      * @see Connection#setHoldability(int)
  149.      */
  150.     public void setHoldability(int arg0) throws SQLException {
  151.         if (closed) {
  152.             throw new SQLException(invalidHandleStr);
  153.         } else {
  154.             try {
  155.                 mc.setHoldability(arg0);
  156.             } catch (SQLException sqlException) {
  157. checkAndFireConnectionError(sqlException);
  158.             }
  159.         }
  160.     }
  161.     /**
  162.      * @see Connection#getHoldability()
  163.      */
  164.     public int getHoldability() throws SQLException {
  165.         if (closed) {
  166.             throw new SQLException(invalidHandleStr);
  167.         } else {
  168.             try {
  169.                 return mc.getHoldability();
  170.             } catch (SQLException sqlException) {
  171. checkAndFireConnectionError(sqlException);
  172.             }
  173.         }
  174.         
  175.         return Statement.CLOSE_CURRENT_RESULT; // we don't reach this code, compiler can't tell
  176.     }
  177.     /**
  178.      * Allows clients to determine how long this connection has been idle.
  179.      *
  180.      * @return how long the connection has been idle.
  181.      */
  182.     public long getIdleFor() {
  183.         return ((com.mysql.jdbc.Connection) mc).getIdleFor();
  184.     }
  185.     /**
  186.      * Passes call to method on physical connection instance.  Notifies
  187.      * listeners of any caught exceptions before re-throwing to client.
  188.      *
  189.      * @return a metadata instance
  190.      *
  191.      * @throws SQLException if an error occurs
  192.      */
  193.     public java.sql.DatabaseMetaData getMetaData() throws SQLException {
  194.         if (closed) {
  195.             throw new SQLException(invalidHandleStr);
  196.         } else {
  197.             try {
  198.                 return mc.getMetaData();
  199.             } catch (SQLException sqlException) {
  200. checkAndFireConnectionError(sqlException);
  201.             }
  202.         }
  203.         
  204.         return null; // we don't reach this code, compiler can't tell
  205.     }
  206.     /**
  207.      * Passes call to method on physical connection instance.  Notifies
  208.      * listeners of any caught exceptions before re-throwing to client.
  209.      *
  210.      * @see java.sql.Connection#setReadOnly()
  211.      */
  212.     public void setReadOnly(boolean readOnly) throws SQLException {
  213.         if (closed) {
  214.             throw new SQLException(invalidHandleStr);
  215.         } else {
  216.             try {
  217.                 mc.setReadOnly(readOnly);
  218.             } catch (SQLException sqlException) {
  219. checkAndFireConnectionError(sqlException);
  220.             }
  221.         }
  222.     }
  223.     /**
  224.      * Passes call to method on physical connection instance.  Notifies
  225.      * listeners of any caught exceptions before re-throwing to client.
  226.      *
  227.      * @see java.sql.Connection#isReadOnly()
  228.      */
  229.     public boolean isReadOnly() throws SQLException {
  230.         if (closed) {
  231.             throw new SQLException(invalidHandleStr);
  232.         } else {
  233.             try {
  234.                 return mc.isReadOnly();
  235.             } catch (SQLException sqlException) {
  236. checkAndFireConnectionError(sqlException);
  237.             }
  238.         }
  239.         
  240.         return false; // we don't reach this code, compiler can't tell
  241.     }
  242.     /**
  243.      * @see Connection#setSavepoint()
  244.      */
  245.     public java.sql.Savepoint setSavepoint() throws SQLException {
  246.         if (closed) {
  247.             throw new SQLException(invalidHandleStr);
  248.         } else {
  249.             try {
  250.                 return mc.setSavepoint();
  251.             } catch (SQLException sqlException) {
  252. checkAndFireConnectionError(sqlException);
  253.             }
  254.         }
  255.         
  256.         return null; // we don't reach this code, compiler can't tell
  257.     }
  258.     /**
  259.      * @see Connection#setSavepoint(String)
  260.      */
  261.     public java.sql.Savepoint setSavepoint(String arg0)
  262.         throws SQLException {
  263.         if (closed) {
  264.             throw new SQLException(invalidHandleStr);
  265.         } else {
  266.             try {
  267.                 return mc.setSavepoint(arg0);
  268.             } catch (SQLException sqlException) {
  269. checkAndFireConnectionError(sqlException);
  270.             }
  271.         }
  272.         
  273.         return null; // we don't reach this code, compiler can't tell
  274.     }
  275.     /**
  276.      * Passes call to method on physical connection instance.  Notifies
  277.      * listeners of any caught exceptions before re-throwing to client.
  278.      *
  279.      * @see java.sql.Connection#setTransactionIsolation()
  280.      */
  281.     public void setTransactionIsolation(int level) throws SQLException {
  282.         if (closed) {
  283.             throw new SQLException(invalidHandleStr);
  284.         } else {
  285.             try {
  286.                 mc.setTransactionIsolation(level);
  287.             } catch (SQLException sqlException) {
  288. checkAndFireConnectionError(sqlException);
  289.             }
  290.         }
  291.     }
  292.     /**
  293.      * Passes call to method on physical connection instance.  Notifies
  294.      * listeners of any caught exceptions before re-throwing to client.
  295.      *
  296.      * @see java.sql.Connection#getTransactionIsolation()
  297.      */
  298.     public int getTransactionIsolation() throws SQLException {
  299.         if (closed) {
  300.             throw new SQLException(invalidHandleStr);
  301.         } else {
  302.             try {
  303.                 return mc.getTransactionIsolation();
  304.             } catch (SQLException sqlException) {
  305. checkAndFireConnectionError(sqlException);
  306.             }
  307.         }
  308.         
  309.         return TRANSACTION_REPEATABLE_READ; // we don't reach this code, compiler can't tell
  310.     }
  311.     /**
  312.      * Passes call to method on physical connection instance.  Notifies
  313.      * listeners of any caught exceptions before re-throwing to client.
  314.      *
  315.      * @see java.sql.Connection#setTypeMap()
  316.      */
  317.     public void setTypeMap(java.util.Map map) throws SQLException {
  318.         if (closed) {
  319.             throw new SQLException(invalidHandleStr);
  320.         } else {
  321.             try {
  322.                 mc.setTypeMap(map);
  323.             } catch (SQLException sqlException) {
  324. checkAndFireConnectionError(sqlException);
  325.             }
  326.         }
  327.     }
  328.     /**
  329.      * Passes call to method on physical connection instance.  Notifies
  330.      * listeners of any caught exceptions before re-throwing to client.
  331.      *
  332.      * @see java.sql.Connection#getTypeMap()
  333.      */
  334.     public java.util.Map getTypeMap() throws SQLException {
  335.         if (closed) {
  336.             throw new SQLException(invalidHandleStr);
  337.         } else {
  338.             try {
  339.                 return mc.getTypeMap();
  340.             } catch (SQLException sqlException) {
  341. checkAndFireConnectionError(sqlException);
  342.             }
  343.         }
  344.         
  345.         return null; // we don't reach this code, compiler can't tell
  346.     }
  347.     /**
  348.      * Passes call to method on physical connection instance.  Notifies
  349.      * listeners of any caught exceptions before re-throwing to client.
  350.      *
  351.      * @see java.sql.Connection#getWarnings
  352.      */
  353.     public java.sql.SQLWarning getWarnings() throws SQLException {
  354.         if (closed) {
  355.             throw new SQLException(invalidHandleStr);
  356.         } else {
  357.             try {
  358.                 return mc.getWarnings();
  359.             } catch (SQLException sqlException) {
  360. checkAndFireConnectionError(sqlException);
  361.             }
  362.         }
  363.         
  364.         return null; // we don't reach this code, compiler can't tell
  365.     }
  366.     /**
  367.      * Passes call to method on physical connection instance.   Notifies
  368.      * listeners of any caught exceptions before  re-throwing to client.
  369.      *
  370.      * @throws SQLException if an error occurs
  371.      */
  372.     public void clearWarnings() throws SQLException {
  373.         if (closed) {
  374.             throw new SQLException(invalidHandleStr);
  375.         } else {
  376.             try {
  377.                 mc.clearWarnings();
  378.             } catch (SQLException sqlException) {
  379. checkAndFireConnectionError(sqlException);
  380.             }
  381.         }
  382.     }
  383.     /**
  384.      * The physical connection is not actually closed.  the physical connection
  385.      * is closed when the application server calls
  386.      * mysqlPooledConnection.close().  this object is  de-referenced by the
  387.      * pooled connection each time mysqlPooledConnection.getConnection()  is
  388.      * called by app server.
  389.      *
  390.      * @throws SQLException if an error occurs
  391.      */
  392.     public void close() throws SQLException {
  393.         close(true);
  394.     }
  395.     /**
  396.      * Passes call to method on physical connection instance.  Notifies
  397.      * listeners of any caught exceptions before re-throwing to client.
  398.      *
  399.      * @throws SQLException if an error occurs
  400.      */
  401.     public void commit() throws SQLException {
  402.         if (closed) {
  403.             throw new SQLException(invalidHandleStr);
  404.         } else {
  405.             try {
  406.                 mc.commit();
  407.             } catch (SQLException sqlException) {
  408. checkAndFireConnectionError(sqlException);
  409.             }
  410.         }
  411.     }
  412.     /**
  413.      * Passes call to method on physical connection instance.  Notifies
  414.      * listeners of any caught exceptions before re-throwing to client.
  415.      *
  416.      * @see java.sql.Connection#createStatement()
  417.      */
  418.     public java.sql.Statement createStatement() throws SQLException {
  419.         if (this.closed) {
  420.             throw new SQLException(invalidHandleStr);
  421.         } else {
  422.             try {
  423.                 return new StatementWrapper(this.mpc, mc.createStatement());
  424.             } catch (SQLException sqlException) {
  425. checkAndFireConnectionError(sqlException);
  426.             }
  427.         }
  428.         
  429.         return null; // we don't reach this code, compiler can't tell
  430.     }
  431.     /**
  432.      * Passes call to method on physical connection instance.  Notifies
  433.      * listeners of any caught exceptions before re-throwing to client.
  434.      *
  435.      * @see java.sql.Connection#createStatement()
  436.      */
  437.     public java.sql.Statement createStatement(int resultSetType,
  438.         int resultSetConcurrency) throws SQLException {
  439.         if (this.closed) {
  440.             throw new SQLException(invalidHandleStr);
  441.         } else {
  442.             try {
  443.                 return new StatementWrapper(this.mpc, mc.createStatement(resultSetType, resultSetConcurrency));
  444.             } catch (SQLException sqlException) {
  445. checkAndFireConnectionError(sqlException);
  446.             }
  447.         }
  448.         
  449.         return null; // we don't reach this code, compiler can't tell
  450.     }
  451.     /**
  452.      * @see Connection#createStatement(int, int, int)
  453.      */
  454.     public java.sql.Statement createStatement(int arg0, int arg1, int arg2)
  455.         throws SQLException {
  456.         if (this.closed) {
  457.             throw new SQLException(invalidHandleStr);
  458.         } else {
  459.             try {
  460.                 return new StatementWrapper(this.mpc, mc.createStatement(arg0, arg1, arg2));
  461.             } catch (SQLException sqlException) {
  462. checkAndFireConnectionError(sqlException);
  463.             }
  464.         }
  465.         
  466.         return null; // we don't reach this code, compiler can't tell
  467.     }
  468.     /**
  469.      * Passes call to method on physical connection instance.  Notifies
  470.      * listeners of any caught exceptions before re-throwing to client.
  471.      *
  472.      * @see java.sql.Connection#nativeSQL()
  473.      */
  474.     public String nativeSQL(String sql) throws SQLException {
  475.         if (closed) {
  476.             throw new SQLException(invalidHandleStr);
  477.         } else {
  478.             try {
  479.                 return mc.nativeSQL(sql);
  480.             } catch (SQLException sqlException) {
  481. checkAndFireConnectionError(sqlException);
  482.             }
  483.         }
  484.         
  485.         return null; // we don't reach this code, compiler can't tell
  486.     }
  487.     /**
  488.      * Passes call to method on physical connection instance.  Notifies
  489.      * listeners of any caught exceptions before re-throwing to client.
  490.      *
  491.      * @see java.sql.Connection#prepareCall()
  492.      */
  493.     public java.sql.CallableStatement prepareCall(String sql)
  494.         throws SQLException {
  495.         if (closed) {
  496.             throw new SQLException(invalidHandleStr);
  497.         } else {
  498.             try {
  499.                 return mc.prepareCall(sql);
  500.             } catch (SQLException sqlException) {
  501. checkAndFireConnectionError(sqlException);
  502.             }
  503.         }
  504.         
  505.         return null; // we don't reach this code, compiler can't tell
  506.     }
  507.     /**
  508.      * Passes call to method on physical connection instance.  Notifies
  509.      * listeners of any caught exceptions before re-throwing to client.
  510.      *
  511.      * @see java.sql.Connection#prepareCall()
  512.      */
  513.     public java.sql.CallableStatement prepareCall(String sql,
  514.         int resultSetType, int resultSetConcurrency) throws SQLException {
  515.         if (closed) {
  516.             throw new SQLException(invalidHandleStr);
  517.         } else {
  518.             try {
  519.                 return mc.prepareCall(sql, resultSetType, resultSetConcurrency);
  520.             } catch (SQLException sqlException) {
  521. checkAndFireConnectionError(sqlException);
  522.             }
  523.         }
  524.         
  525.         return null; // we don't reach this code, compiler can't tell
  526.     }
  527.     /**
  528.      * @see Connection#prepareCall(String, int, int, int)
  529.      */
  530.     public java.sql.CallableStatement prepareCall(String arg0, int arg1,
  531.         int arg2, int arg3) throws SQLException {
  532.         if (closed) {
  533.             throw new SQLException(invalidHandleStr);
  534.         } else {
  535.             try {
  536.                 return mc.prepareCall(arg0, arg1, arg2, arg3);
  537.             } catch (SQLException sqlException) {
  538. checkAndFireConnectionError(sqlException);
  539.             }
  540.         }
  541.         
  542.         return null; // we don't reach this code, compiler can't tell
  543.     }
  544.     /**
  545.      * Passes call to method on physical connection instance.  Notifies
  546.      * listeners of any caught exceptions before re-throwing to client.
  547.      *
  548.      * @see java.sql.Connection#prepareStatement()
  549.      */
  550.     public java.sql.PreparedStatement prepareStatement(String sql)
  551.         throws SQLException {
  552.         if (this.closed) {
  553.             throw new SQLException(invalidHandleStr);
  554.         } else {
  555.             try {
  556.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(sql));
  557.             } catch (SQLException sqlException) {
  558. checkAndFireConnectionError(sqlException);
  559.             }
  560.         }
  561.         
  562.         return null; // we don't reach this code, compiler can't tell
  563.     }
  564.     /**
  565.      * Passes call to method on physical connection instance.  Notifies
  566.      * listeners of any caught exceptions before re-throwing to client.
  567.      *
  568.      * @see java.sql.Connection#prepareStatement()
  569.      */
  570.     public java.sql.PreparedStatement prepareStatement(String sql,
  571.         int resultSetType, int resultSetConcurrency) throws SQLException {
  572.         if (this.closed) {
  573.             throw new SQLException(invalidHandleStr);
  574.         } else {
  575.             try {
  576.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(sql, resultSetType,
  577.                     resultSetConcurrency));
  578.             } catch (SQLException sqlException) {
  579. checkAndFireConnectionError(sqlException);
  580.             }
  581.         }
  582.         
  583.         return null; // we don't reach this code, compiler can't tell
  584.     }
  585.     /**
  586.      * @see Connection#prepareStatement(String, int, int, int)
  587.      */
  588.     public java.sql.PreparedStatement prepareStatement(String arg0, int arg1,
  589.         int arg2, int arg3) throws SQLException {
  590.         if (this.closed) {
  591.             throw new SQLException(invalidHandleStr);
  592.         } else {
  593.             try {
  594.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(arg0, arg1, arg2, arg3));
  595.             } catch (SQLException sqlException) {
  596. checkAndFireConnectionError(sqlException);
  597.             }
  598.         }
  599.         
  600.         return null; // we don't reach this code, compiler can't tell
  601.     }
  602.     /**
  603.      * @see Connection#prepareStatement(String, int)
  604.      */
  605.     public java.sql.PreparedStatement prepareStatement(String arg0, int arg1)
  606.         throws SQLException {
  607.         if (this.closed) {
  608.             throw new SQLException(invalidHandleStr);
  609.         } else {
  610.             try {
  611.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(arg0, arg1));
  612.             } catch (SQLException sqlException) {
  613. checkAndFireConnectionError(sqlException);
  614.             }
  615.         }
  616.         
  617.         return null; // we don't reach this code, compiler can't tell
  618.     }
  619.     /**
  620.      * @see Connection#prepareStatement(String, int[])
  621.      */
  622.     public java.sql.PreparedStatement prepareStatement(String arg0, int[] arg1)
  623.         throws SQLException {
  624.         if (this.closed) {
  625.             throw new SQLException(invalidHandleStr);
  626.         } else {
  627.             try {
  628.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(arg0, arg1));
  629.             } catch (SQLException sqlException) {
  630. checkAndFireConnectionError(sqlException);
  631.             }
  632.         }
  633.         
  634.         return null; // we don't reach this code, compiler can't tell
  635.     }
  636.     /**
  637.      * @see Connection#prepareStatement(String, String[])
  638.      */
  639.     public java.sql.PreparedStatement prepareStatement(String arg0,
  640.         String[] arg1) throws SQLException {
  641.         if (this.closed) {
  642.             throw new SQLException(invalidHandleStr);
  643.         } else {
  644.             try {
  645.                 return new PreparedStatementWrapper(this.mpc, mc.prepareStatement(arg0, arg1));
  646.             } catch (SQLException sqlException) {
  647. checkAndFireConnectionError(sqlException);
  648.             }
  649.         } 
  650.         
  651.         return null; // we don't reach this code, compiler can't tell
  652.     }
  653.     /**
  654.      * @see Connection#releaseSavepoint(Savepoint)
  655.      */
  656.     public void releaseSavepoint(Savepoint arg0) throws SQLException {
  657.         if (closed) {
  658.             throw new SQLException(invalidHandleStr);
  659.         } else {
  660.             try {
  661.                 mc.releaseSavepoint(arg0);
  662.             } catch (SQLException sqlException) {
  663. checkAndFireConnectionError(sqlException);
  664.             }
  665.         }
  666.     }
  667.     /**
  668.      * Passes call to method on physical connection instance.  Notifies
  669.      * listeners of any caught exceptions before re-throwing to client.
  670.      *
  671.      * @see java.sql.Connection#rollback()
  672.      */
  673.     public void rollback() throws SQLException {
  674.         if (closed) {
  675.             throw new SQLException(invalidHandleStr);
  676.         } else {
  677.             try {
  678.                 mc.rollback();
  679.             } catch (SQLException sqlException) {
  680. checkAndFireConnectionError(sqlException);
  681.             }
  682.         }
  683.     }
  684.     /**
  685.      * @see Connection#rollback(Savepoint)
  686.      */
  687.     public void rollback(Savepoint arg0) throws SQLException {
  688.         if (closed) {
  689.             throw new SQLException(invalidHandleStr);
  690.         } else {
  691.             try {
  692.                 mc.rollback(arg0);
  693.             } catch (SQLException sqlException) {
  694. checkAndFireConnectionError(sqlException);
  695.             }
  696.         }
  697.     }
  698.     protected void close(boolean fireClosedEvent)
  699.         throws SQLException {
  700.     
  701.      synchronized (this.mpc) {
  702.      if (closed) {
  703.      return;
  704.      }
  705.      if (fireClosedEvent) {
  706.      mpc.callListener(MysqlPooledConnection.CONNECTION_CLOSED_EVENT, null);
  707.      }
  708.      // set closed status to true so that if application client tries to make additional
  709.      // calls a sqlException will be thrown.  The physical connection is
  710.      // re-used by the pooled connection each time getConnection is called.
  711.      this.closed = true;
  712.      }
  713.     }
  714. }