patch to notify listeners on error from Csaba Nagy
authorDave Cramer
Tue, 25 Mar 2003 02:46:23 +0000 (02:46 +0000)
committerDave Cramer
Tue, 25 Mar 2003 02:46:23 +0000 (02:46 +0000)
src/interfaces/jdbc/org/postgresql/jdbc2/optional/PooledConnectionImpl.java

index 4970240a030883e83487022ca925f288e25efaf9..2a5190e0e614424f2059611743d796032bce6a4b 100644 (file)
@@ -13,7 +13,8 @@ import org.postgresql.PGConnection;
  * @see ConnectionPool
  *
  * @author Aaron Mulder ([email protected])
- * @version $Revision: 1.6 $
+ * @author Csaba Nagy ([email protected])
+ * @version $Revision: 1.7 $
  */
 public class PooledConnectionImpl implements PooledConnection
 {
@@ -95,33 +96,47 @@ public class PooledConnectionImpl implements PooledConnection
    {
        if (con == null)
        {
-           throw new SQLException("This PooledConnection has already been closed!");
+           // Before throwing the exception, let's notify the registered listeners about the error
+           final SQLException sqlException = new SQLException("This PooledConnection has already been closed!");
+           fireConnectionFatalError(sqlException);
+           throw sqlException;
        }
-       // Only one connection can be open at a time from this PooledConnection.  See JDBC 2.0 Optional Package spec section 6.2.3
-       if (last != null)
+       // If any error occures while opening a new connection, the listeners
+       // have to be notified. This gives a chance to connection pools to
+       // elliminate bad pooled connections.
+       try
        {
-           last.close();
-           if (!con.getAutoCommit())
+           // Only one connection can be open at a time from this PooledConnection.  See JDBC 2.0 Optional Package spec section 6.2.3
+           if (last != null)
            {
-               try
+               last.close();
+               if (!con.getAutoCommit())
                {
-                   con.rollback();
+                   try
+                   {
+                       con.rollback();
+                   }
+                   catch (SQLException e)
+                   {}
                }
-               catch (SQLException e)
-               {}
+               con.clearWarnings();
            }
-           con.clearWarnings();
+           con.setAutoCommit(autoCommit);
+       }
+       catch (SQLException sqlException)
+       {
+           fireConnectionFatalError(sqlException);
+           throw (SQLException)sqlException.fillInStackTrace();
        }
-       con.setAutoCommit(autoCommit);
        ConnectionHandler handler = new ConnectionHandler(con);
        last = handler;
        Connection con = (Connection)Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Connection.class, PGConnection.class}, handler);
-        last.setProxy(con);
-        return con;
+       last.setProxy(con);
+       return con;
    }
 
    /**
-    * Used to fire a connection event to all listeners.
+    * Used to fire a connection closed event to all listeners.
     */
    void fireConnectionClosed()
    {
@@ -140,7 +155,7 @@ public class PooledConnectionImpl implements PooledConnection
    }
 
    /**
-    * Used to fire a connection event to all listeners.
+    * Used to fire a connection error event to all listeners.
     */
    void fireConnectionFatalError(SQLException e)
    {
@@ -363,7 +378,7 @@ public class PooledConnectionImpl implements PooledConnection
             }
             else
             {
-                try 
+                try
                 {
                     return method.invoke(st, args);
                 }